我有一个查询,我使用连接列表中的标记返回集合中的所有标记,但我正在尝试确定如何编写将返回相同结果但仅针对那些项目的查询一个特定的标签..列表按标签说话,如果你愿意的话。从逻辑上讲,如果我添加'where tbl_tag.tag_id = 3',它只列出组中的特定标签..我希望它能够仍然列出所有这些标签。可能有多个查询是答案,但我很好奇是否可以用一个查询。
SELECT tbl_talks.*,
GROUP_CONCAT(tbl_tag.tag_name ORDER BY tbl_tag.tag_name) AS tags
FROM tbl_talks
LEFT JOIN tbl_linking_talk_tag
ON tbl_talks.talk_id = tbl_linking_talk_tag.talk_id
LEFT JOIN tbl_tag
ON tbl_linking_talk_tag.tag_id = tbl_tag.tag_id
GROUP BY tbl_talks.talk_id
答案 0 :(得分:0)
快速,黑客的解决方案是将整个查询包装在外部查询中,并且仅使用WHERE tags LIKE '%....%
返回包含相应标记的记录。这是脆弱的,因为总有可能你有一个标签(例如“浆果”)是另一个标签(例如“草莓”)。有很多方法可以解决这个问题,但它们并不漂亮而且不是很苛刻。
稍微更正确(同样未经测试!)的解决方案是将原始查询作为子查询添加到WHERE
子句中:
WHERE EXISTS
(
SELECT
1
FROM
tbl_talks
LEFT JOIN tbl_linking_talk_tag
ON tbl_talks.talk_id = tbl_linking_talk_tag.talk_id
LEFT JOIN tbl_tag
ON tbl_linking_talk_tag.tag_id = tbl_tag.tag_id
WHERE
tbl_tag.tag_id IN (the, tag_ids, you, want)
)
在MySQL中可能有一种更简单的内置方法,但我不知道。