我有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.ID,如347所建议的那样,首先修复了问题并且我可以获得cd的所有标签,但它不会获取所有标签链接到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 :(得分:0)
如何更改WHERE子句以查找链接了标记的所有cds.ID
:
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*