【问题标题】:MySQL - Select by some "tags", include all tagsMySQL - 通过一些“标签”选择,包括所有标签
【发布时间】:2013-09-14 22:06:31
【问题描述】:

我已经成功地通过以 AND 方式匹配标签来获取文章过滤。

这是我当前的代码:

SELECT *
FROM articles a
JOIN article_tags a_t ON a_t.article_id = a.id
LEFT JOIN tags t ON t.id = a_t.tag_id
WHERE t.caption IN ('fire', 'water', 'earth')
HAVING COUNT(DISTINCT t.caption) = 3

地点:

  • articles 是我要获取的文章,带有 id、title 等...
  • tags 是标签列表,带有 id 和标题
  • article_tags 关系表,带有 article_id 和 tag_id

现在的问题是,匹配后,我想检索每篇文章的所有标签。即使它们被 3 个不同的匹配,一个可能有 5 个标签,其他 4 个标签,我希望它们包含在每一行中。在某些“标签”列中,诸如“标签、标签、标签”之类的东西或我可以解析的任何东西。

有什么想法吗?我找不到解决办法...

【问题讨论】:

    标签: mysql


    【解决方案1】:

    您需要将查询作为子查询与返回所有标签并将它们与GROUP_CONCAT() 组合的查询加入。

    select a.*, GROUP_CONCAT(DISTINCT t.caption) tags
    from (select distinct a.*
          from articles a
          JOIN article_tags a_t on a_t.article_id = a.id
          JOIN tags t on t.id = a_t.tag_id
          WHERE t.caption IN ('fire', 'water', 'earth')
          GROUP BY a.id
          HAVING COUNT(DISTINCT t.caption) = 3) a
    JOIN article_tags a_t on a_t.article_id = a.id
    JOIN tags t on t.id = a_t.tag_id
    GROUP BY a.id
    

    顺便说一句,没有理由在您的查询中使用LEFT JOIN,因为您只关心与tags 匹配的行。

    我还想知道COUNT() 中是否需要DISTINCT——你真的允许多个标签ID 具有相同的标题吗?

    【讨论】:

    • 谢谢!但是,我现在只得到一个结果行。有什么想法吗? P.S: Left Join and Distinct notes: 因为我是菜鸟 xD 哈哈。
    • 已修复。我在子查询中遗漏了 GROUP BY(因为我从您的问题中复制了它,也遗漏了它)。
    • 像魅力一样工作。我现在已经学会了 GROUP_CONCAT。谢谢你,先生。所以我不打算使用 DISTINCT。标签名称是唯一的。删除它,它就可以正常工作了,对吧?
    • 是的,您添加它是为了更加安全,我也是 :)
    猜你喜欢
    • 2023-03-17
    • 1970-01-01
    • 2014-02-10
    • 2013-05-01
    • 2015-09-08
    • 2019-09-24
    • 2018-03-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多