2012-07-01 161 views
1

我有一個帶有3個表格的內容數據庫,我需要根據標籤查詢來獲取內容。mysql query按標籤選擇

的表是這樣的:

nv_entries: 
id - title - year - etc.. 

nv_tags: 
id - entrieid - tag 

nv_images: 
id - entrieid - source 

比方說,我想,有標籤「盧梭」,並在其中既有「模糊」的所有條目。 之後,圖像應該加入以及entrieid = entrieid。

這可能可以完成一個查詢,但我不知道如何。

$query = "SELECT * from nv_entries WHERE ??? 

請幫助

回答

0
SELECT * FROM 
nv_entries entries 
INNER JOIN nv_tags tags ON tags.entrieid = entries.id 
INNER JOIN nv_images imgs ON imgs.entrieid = entries.id 
WHERE tags.tag IN('rousseau','fuzz') 

但是這將從三個表中提取所有數據。 指定相對於表格的標籤以避免冗餘標籤爲entrieid。

+0

這是行不通的。 tags.tag不能同時等於rousseau和fuzz。 SQL一次處理一行。 –

+0

@RC:你說得對! 請更正此問題。告訴這個工作?如果沒有工作,然後使用tags.tag IN('rousseau','fuzz')。 PS: 一位用戶發佈了一個具有相同IN條件的答案,但我說他錯了,他刪除了答案。我爲他感到難過。你可以包括你的答案。 –

+0

如果使用更多標籤(或者只是1個),該怎麼辦? – clankill3r

1

由於條目和標籤之間有一對多關係,因此必須在標籤表上使用數據透視表。簡單地說,標記='x'和標記='y'將不起作用,因爲引擎逐行查看,因此標記不能同時具有兩個值。所以,基本上你會轉向,爲每個條目分配標誌,以指明該條目是否被看到有你想要的標籤值。

SELECT * 
FROM nv_entries entries 
JOIN (
    SELECT entrieid, 
      COUNT(CASE WHEN (tag = 'rousseau') THEN 1 ELSE null END) has_rousseau, 
      COUNT(CASE WHEN (tag = 'fuzz') THEN 1 ELSE null END) has_fuzz 
    FROM nv_tags 
    GROUP BY entrieid 
    HAVING has_rousseau != 0 and has_fuzz != 0 
    ) tags ON (entries.id = tags.entrieid) 
JOIN nv_images images ON (tags.entrieid = images.entrieid); 
+0

如果使用其他標籤或使用3個​​標籤/ 4標籤,這是非常困難的。任何解決方案? – clankill3r

+0

獲取條目的次數是多少,並查看一下php的載入次數是多少次,如果它等於標籤的數量,那麼保存它? – clankill3r

+0

我不清楚你在評論中關於「獲得雙倍獎品」的說法。就困難而言,您可以使查詢更通用,並動態構建SQL以提供正在搜索的正確數量的值。 (儘管使用綁定變量傳遞實際值) –