【问题标题】:Need help with sql query to find things with most specified tags需要有关 sql 查询的帮助以查找具有大多数指定标签的内容
【发布时间】:2010-10-06 19:40:57
【问题描述】:

假设我有以下表格:

标签

id:整数
名称:字符串

帖子

id:整数
正文:文本

标记

id:整数
tag_id: 整数
post_id: 整数

我将如何编写一个查询,按包含最多以下标签(标签表的名称属性)的帖子的顺序选择所有帖子:“Cheese”、“Wine”、“Paris”、“Frace ”、“城市”、“风景”、“艺术”

另见:Need help with sql query to find things tagged with all specified tags(注意:相似,但不能重复!)

【问题讨论】:

  • 这不是重复的,请停止投票以关闭它。
  • 正确的@OMG Ponies .... 我知道这是相同的数据,但我需要用它做两件非常不同的事情。

标签: sql mysql ruby-on-rails tags tagging


【解决方案1】:

与您的链接问题不同,您没有在此处指定您需要匹配所有标签。此查询适用于 ANY。

SELECT p.id, p.text, count(tg.id) as TagCount
    FROM Posts p 
        INNER JOIN Taggings tg 
            ON p.id = tg.post_id
        INNER JOIN Tags t 
            ON tg.tag_id = t.id
    WHERE t.name in ('Cheese', 'Wine', 'Paris', 'Frace', 'City', 'Scenic', 'Art')
    GROUP BY p.id, p.text
    ORDER BY TagCount DESC

【讨论】:

  • 正确,它们不需要匹配所有...只需返回比其他匹配更多的第一个
  • 实际上,我在帖子上实际上有更多的字段,而不仅仅是 id 和 text...有没有办法让它返回所有字段而不在查询中指定每个字段?也许 p.*?我不是 sql 专家。
  • 不要在查询中使用 *。在SELECTGROUP BY 中列出您需要的所有列。
  • 为什么?我需要使用所有的列。
  • SELECT * 是个坏主意有几个原因。关键之一是您限制了优化器选择适当索引的能力。见here。此外,为了代码稳定性,如果有人在将来更改 POSTS 表并添加一个新列,您的 SELECT * 会拾取它,并且可能会破坏您的应用程序,该应用程序原本期望取回 2 列,现在得到 3返回。
【解决方案2】:

试试这个:

   Select p.Id, p.Text, Count(*)
   From Posts p 
      Left Join (Taggings tg Join Tags t 
                    On t.Tag_Id = tg.Tag_Id
                       And t.name in     
                        ('Cheese', 'Wine', 'Paris', 
                         'Frace', 'City', 'Scenic', 'Art'))
         On tg.Post_Id = p.Post_Id
   Group By p.Id, p.text  
   Order By Count(*) Desc

【讨论】:

    猜你喜欢
    • 2011-04-22
    • 2011-02-22
    • 2017-08-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多