2012-09-10 11 views
6

que desea recuperar algunas etiquetas de mi base de datos, que son de la forma:cómo seleccionar palabras clave únicas de una coma separó etiquetas

topic_id  tags 
    1  `tag1,tag2,tag3` 
    2  `tag1,tag4,tag5` 
    3  `tag2,tag4,tag5` 
    4  `tag6,tag7,tag2` 

quiero tener algo como esto:

tag1 tag2 tag3 tag4 tag5 tag6 tag7 

es decir, todas las etiquetas únicas

De modo que pueda ajustar cada etiqueta en un enlace para agrupar las noticias que tengan tales etiquetas específicas.

Esto siguiente consulta que he escrito hasta ahora no está funcionando:

$tags = mysql_query("SELECT tags, topic_id 
         FROM forum_topics 
         WHERE topic_id > 0") or die (mysql_error()); 
        while($tag = mysql_fetch_assoc($tags)){ 
        $split_tags = "$tag"; 
        $pieces = explode(",", $split_tags); 
        echo $pieces ; 

Cuando hice print_r($pieces);

que tiene Array ([0] => Array) Array ([0] => Array) Array ([0] => Array) Array ([0] => Array)

que no era lo que estaba buscando.

Como es ahora mi estructura de tabla se ve así topic_id , topic_head, topic_body, topic_tag, topic_date, topic_owner .. ¿Cómo puedo hacer que el topic_tag sea normal?

+2

¿Es esta una tabla que usted construyó? Si es así, claramente no está normalizado. Una tabla normalizada tendría una asignación de 1 a 1 entre topic_id y las etiquetas. A continuación, puede simplemente hacer una consulta 'select distinct tags from forum_topics' para obtener lo que desea. –

+5

Además, no use las funciones 'mysql_ *' en su código. Estas funciones ya no se mantienen y están [en desuso] (http://news.php.net/php.internals/53799). En su lugar, debe usar [MySQLi] (http://php.net/mysqli) o [PDO] (http://php.net/pdo). No sabes que usar? [Este artículo] (http://php.net/manual/en/mysqlinfo.api.choosing.php) debería ayudar. –

Respuesta

3

Si normalizar el diseño de su base de datos, entonces se podría conseguir todas las distintas etiquetas muy fácil por

SELECT DISTINCT tags FROM forum_topics WHERE topic_id > 0 

Pero ahora, con la estructura de su base de datos, no se puede hacer esto, usted tiene que obtener todas las etiquetas y usar array_unique en ellas.

$tags = array(); 
$rows = mysql_query("SELECT tags FROM forum_topics WHERE topic_id > 0") or die (mysql_error()); 
while($row = mysql_fetch_assoc($rows)){ 
    $tags = array_merge($tags, explode(',' $row['tags'])); 
} 
$tags = array_unique($tags); 
print_r($tags); 

Pero incluso se podía hacer esto, normalizar el diseño de su base de datos es la mejor opción.

+0

Gracias por la respuesta. Como es ahora, mi estructura de tabla tiene este aspecto 'topic_id, topic_head, topic_body, topic_tag, topic_date, topic_owner' .. ¿Cómo puedo hacer que topic_tag sea aún más normal? –

+1

@DotOyes Crea otra tabla 'topic_tags' para administrar la relación de temas y etiquetas. – xdazz

2

Prueba esto:

$tags = ""; 
while($row = mysql_fetch_assoc($tags)) { 
    $tags .= $row["tags"] . ","; 
} 

$tags = rtrim($tags, ","); 
$pieces = explode(",", $tags); 

print_r($pieces); // all of them 

$pieces = array_unique($pieces); 

print_r($pieces); // distinct 

... y como Jonah Bishop already mentioned, por favor, evita mysql_* funciones.

0
select distinct tags from forum_topics; 
+1

No estoy 100% seguro de que esto dará como resultado lo que quiere el OP. Su tabla no está normalizada, por lo que (potencialmente) obtendrá tantos resultados como entradas haya. –

+0

Ahh, bueno, eso complica las cosas. (Y lo siento, no vi tu comentario). –

Cuestiones relacionadas