2014-02-10 66 views
1

我有3個表格來創建一個標籤系統(cds,cds_tags,tags),我想顯示具有用戶提交的特定標籤列表的行。雖然我得到正確的結果,但它只顯示與用戶搜索標籤匹配的標籤。搜索標籤並顯示全部

SELECT cds.TITLE , GROUP_CONCAT(tags.TAG_NAME SEPARATOR ',') 
FROM cds 
JOIN cds_tags ON cds_tags.CD_ID = cds.ID 
JOIN tags ON tags.TAG_ID = cds_tags.TAG_ID 
WHERE tags.TAG_NAME IN (*the tags the user searches for*) 
GROUP BY cds.TITLE 
HAVING COUNT(DISTINCT tags.TAG_NAME) = *the count of searching tags* 

我想獲取cd的所有標籤,而不僅僅是用戶搜索的標籤。

更新:儘管更改WHERE子句以查找具有鏈接到他們的標記的所有cds.IDs,如由逗留者建議的,首先解決了問題,並且我可以獲取cd的所有標記,但它沒有' t在所有標籤都鏈接到CD的情況下獲得結果。 例如當我搜索帶有標籤的CD時:rock,house ..我將所有帶有2個標籤的CD和以前的標籤中的至少1個鏈接起來。有沒有辦法解決它?

更新2: 問題是HAVING COUNT()以外的子查詢。正確的查詢是

SELECT cds.TITLE , GROUP_CONCAT(tags.TAG_NAME SEPARATOR ',') 
FROM cds 
    JOIN cds_tags ON cds_tags.CD_ID = cds.ID 
    JOIN tags ON tags.TAG_ID = cds_tags.TAG_ID 
WHERE cds.ID IN 
(
    SELECT sct.CD_ID 
    FROM cds_tags sct 
    JOIN tags st ON st.TAG_ID = sct.TAG_ID 
    WHERE st.TAG_NAME IN (*the tags the user searches for*) 
    HAVING COUNT(DISTINCT tags.TAG_NAME) = *the count of searching tags* 
    GROUP BY sct.CD_ID 

) 
GROUP BY cds.TITLE 

回答

0

如何改變你的WHERE子句來查找所有cds.ID S作鏈接到他們的標籤:

SELECT cds.TITLE , GROUP_CONCAT(tags.TAG_NAME SEPARATOR ',') 
FROM cds 
    JOIN cds_tags ON cds_tags.CD_ID = cds.ID 
    JOIN tags ON tags.TAG_ID = cds_tags.TAG_ID 
WHERE cds.ID IN 
(
    SELECT sct.CD_ID 
    FROM cds_tags sct 
    JOIN tags st ON st.TAG_ID = sct.TAG_ID 
    WHERE st.TAG_NAME IN (*the tags the user searches for*) 
) 
GROUP BY cds.TITLE 
HAVING COUNT(DISTINCT tags.TAG_NAME) = *the count of searching tags* 
+0

非常感謝您的快速反應! –