sql在链接表中获取标签

时间:2011-02-13 18:03:48

标签: mysql tags relational-database

我有一个查询,我使用连接列表中的标记返回集合中的所有标记,但我正在尝试确定如何编写将返回相同结果但仅针对那些项目的查询一个特定的标签..列表按标签说话,如果你愿意的话。从逻辑上讲,如果我添加'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

1 个答案:

答案 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中可能有一种更简单的内置方法,但我不知道。