搜索标签并显示所有内容

时间:2014-02-10 15:37:38

标签: mysql tags

我有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

1 个答案:

答案 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*