【问题标题】:SQL-query to find articles with at least one of the listed tagsSQL 查询以查找具有至少一个列出的标签的文章
【发布时间】:2010-02-10 22:45:31
【问题描述】:

我有 3 个表:articles、tags 和 article_tag(连接它们的那个)。

我想查找在查询中列出了部分(或全部)标签的所有文章,并按匹配标签的数量对它们进行排序。有可能吗?

英文示例:

Query: Find me all articles that have at least one of these tags "jazz, bass guitar, soul, funk", order them by the number of matched tags.

Output:
Article 1 (jazz, bass-guitar, soul, funk)
Article 2 (jazz, bass-guitar, soul)
Article 3 (jazz, bass-guitar)
Article 4 (funk)

【问题讨论】:

    标签: sql select mysql


    【解决方案1】:

    大概是这样的:

    select articles.article_id, count(tags.tag_id) as num_tags, group_concat(distinct tag_name separator ',') as tags
    from articles, article_tag, tags
    where articles.tag_id = article_tag.tag_id
      and article_tag.tag_id = tags.tag_id
      and tags.tag_name in ( 'jazz', 'funk', 'soul', 'Britney Spears' )
    group by articles.article_id
    order by count(tags.tag_id) desc
    

    【讨论】:

    • +1 表示 GROUP_CONCAT()。但实际上,在那里不需要 DISTINCT - 模式应该已经强制执行唯一的文章/标签组合。不过,我要添加的是 ORDER BY tag_name,因此列表按字母顺序排列整齐。
    • 是的,架构没有发布,所以我不确定它会执行什么。
    • 谢谢。不过,您犯了一个小错误,articles.tag_id 应该是 WHERE 子句中的articles.article_id。不过非常感谢。
    • 是的,你是对的,应该是articles.article_id = article_tag.article_id
    【解决方案2】:
    select a.* from articles a,
     (select article_id, count(*) cnt from article_tag at, tag t
      where t.name in ('jazz', 'bass-guitar', 'soul', 'funk')
      and at.tag_id = t.tag_id
      group by article_id) art_tag
    where a.article_id = art_tag.article_id
    order by art_tag.cnt desc
    

    【讨论】:

    • 不会按匹配标签的数量排序。
    猜你喜欢
    • 2011-11-23
    • 1970-01-01
    • 2016-11-05
    • 2016-01-10
    • 2015-10-13
    • 2018-09-17
    • 1970-01-01
    • 2022-01-16
    • 1970-01-01
    相关资源
    最近更新 更多