2012-09-10 20 views
6

virgülle ayrılmış bir etiket benzersiz anahtar kelimeleri seçmek için, onlar biçimindedir:nasıl benim veritabanından bazı etiketlerini almak isteyen

tag1 tag2 tag3 tag4 tag5 tag6 tag7 
:

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

Böyle bir şey olmasını istediğiniz

yani tüm benzersiz etiketler

Böylece, belirli etiketlere sahip haber makalelerini gruplandırmak için her etiketi bir bağlantıya sardım.

şimdiye kadar yazdım Bu aşağıdaki sorgu

çalışmıyor:

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

Ben

print_r($pieces); ı arıyordu değil ne

Array ([0] => Array) Array ([0] => Array) Array ([0] => Array) Array ([0] => Array) var yaptığında.

Artık benim tablo yapım şu şekildedir topic_id , topic_head, topic_body, topic_tag, topic_date, topic_owner .. topic_tag normalini nasıl daha da geliştirebilirim.

+2

Bu, oluşturduğunuz bir tablo mu? Eğer öyleyse, açıkça normalize edilmez. Normalleştirilmiş bir tablo, topic_id ve etiketler arasında bire bir eşleştirmeye sahip olur. Ardından, istediğiniz şeyi elde etmek için forum_topics sorgusundan bir "farklı etiket seçin" ifadesini kullanabilirsiniz. –

+5

Ayrıca, kodunuzdaki 'mysql_ *' işlevlerini kullanmayın. Bu işlevler artık korunmuyor ve [kullanımdan kaldırılıyor] (http://news.php.net/php.internals/53799). Bunun yerine, [MySQLi] (http://php.net/mysqli) veya [PDO] (http://php.net/pdo) kullanmalısınız. Hangisini kullanacağınızı bilmiyor musunuz? [Bu makale] (http://php.net/manual/en/mysqlinfo.api.choosing.php) yardımcı olmalıdır. –

cevap

3

, o zaman veritabanı yapısı ile, artık çok

SELECT DISTINCT tags FROM forum_topics WHERE topic_id > 0 

tarafından kolay Ama bütün farklı etiketler alabilir, bunu yapamaz, yapmak zorundasın Tüm etiketleri alın ve bunlara array_unique kullanın.

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

Ama sen bile bu yapabileceğini, veritabanı tasarımı en iyi seçimdir normalleştirmek.

+0

Cevabınız için teşekkürler. Şimdi benim tablo yapısı bu gibi görünüyor 'topic_id, topic_head, topic_body, topic_tag, topic_date, topic_owner' .. Daha fazla konu_tag normal yapabilirim. –

+1

@DotOyes Konuların ve etiketlerin ilişkisini yönetmek için başka bir tablo 'topic_tags' oluşturun. – xdazz

2

bu deneyin:

$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 

... ve Jonah Bishop already mentioned olarak, mysql_* fonksiyonlarını kaçının. Eğer veritabanı tasarımını normalleştirebilirse

0
select distinct tags from forum_topics; 
+1

OP'nin istediği sonuçla sonuçlanacağından% 100 emin değilim. Onun tablosu normalleştirilmemiş, bu yüzden girişler olduğu için (potansiyel olarak) birçok sonuç elde edersiniz. –

+0

Ahh, bu işleri zorlaştırıyor. (Ve üzgünüm, yorumunuzu görmedim). –

İlgili konular