2012-09-10 12 views
6

Ich möchte wählen einige Tags aus meiner Datenbank abgerufen werden, sind sie in der Form:wie Keywords von einem Komma getrennt Tags

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

ich so etwas wie dieses haben wollen:

tag1 tag2 tag3 tag4 tag5 tag6 tag7 

dh alle eindeutigen Tags

So dass ich jedes Tag in einen Link wickeln kann, um Nachrichtenartikel zu gruppieren, die solche spezifischen Tags hat.

Diese folgende Abfrage I ist bisher geschrieben habe nicht funktioniert:

$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 ; 

Als ich print_r($pieces);

tat bekam ich Array ([0] => Array) Array ([0] => Array) Array ([0] => Array) Array ([0] => Array)

Was nicht war, was ich suchte.

Wie es jetzt aussieht, sieht meine Tabellenstruktur so aus topic_id , topic_head, topic_body, topic_tag, topic_date, topic_owner .. Wie kann ich das topic_tag weiter normal machen.

+2

Ist das eine Tabelle, die Sie erstellt haben? Wenn ja, ist es eindeutig nicht normalisiert. Eine normalisierte Tabelle würde eine 1-zu-1-Zuordnung zwischen der topic_id und den Tags haben. Sie könnten dann einfach eine 'Select distinct Tags from forum_topics'-Abfrage ausführen, um zu bekommen, was Sie wollen. –

+5

Verwenden Sie auch nicht die 'mysql_ *' Funktionen in Ihrem Code. Diese Funktionen werden nicht länger beibehalten und werden [veraltet] (http://news.php.net/php.internals/53799). Stattdessen sollten Sie entweder [MySQLi] (http://php.net/mysqli) oder [PDO] (http://php.net/pdo) verwenden. Weiß nicht, welches ich benutzen soll? [Dieser Artikel] (http://php.net/manual/en/mysqlinfo.api.choosing.php) sollte helfen. –

Antwort

3

Wenn Sie Ihre Datenbank-Design normalisieren, dann könnten Sie alle verschiedene Tags sehr einfach durch

SELECT DISTINCT tags FROM forum_topics WHERE topic_id > 0 

Aber jetzt bekommen, mit Ihrer Datenbankstruktur, können Sie dies nicht tun können, müssen Sie Holen Sie sich alle Tags und verwenden Sie array_unique auf ihnen.

$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); 

Aber selbst könnten Sie dies tun, normalisieren Ihre Datenbank-Design die beste Wahl ist.

+0

Danke für die Antwort. Wie es jetzt aussieht, sieht meine Tabellenstruktur wie folgt aus: 'topic_id, topic_head, topic_body, topic_tag, topic_date, topic_owner' .. Wie kann ich das topic_tag weiter normalisieren? –

+1

@DotOyes Erstellen Sie eine weitere Tabelle 'topic_tags', um die Beziehung von Themen und Tags zu verwalten. – xdazz

2

Try this:

$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 

... und als Jonah Bishop already mentioned, bitte mysql_* Funktionen vermeiden.

0
select distinct tags from forum_topics; 
+1

Ich bin nicht 100% sicher, dass dies ergeben wird, was das OP will. Seine Tabelle ist nicht normalisiert, sodass Sie (potenziell) so viele Ergebnisse zurückbekommen wie Einträge vorhanden sind. –

+0

Ahh, das kompliziert die Dinge. (Und tut mir leid, dass ich deinen Kommentar nicht gesehen habe). –