我的数据库(MySQL)中有 3 个表。
categories (name:string)
items (name:string, category_id:int)
votes (value:int, item_id:int, created_at:datetime)
所以一个类别有很多项目,一个项目有很多投票。
我想编写一个查询来获取最受欢迎的类别,这意味着获取上周获得最多票数(向上或向下)的类别。
我开始尝试更简单的东西,只是获得流行的物品,但我现在真的只是在猜测,它不起作用。
SELECT *, COUNT(votes.item_id) AS score
FROM items
JOIN votes USING(item_id)
WHERE votes.created_at > #{1.week.ago}
ORDER BY COUNT(votes.item_id) DESC LIMIT 5;
我真的不知道我在做什么,有什么想法吗?另外,如果有人知道像这样进行更高级的选择的好文章,我很乐意阅读。 MySQL 文档有点神秘,我不太了解“AS”和“JOINS”。
最佳答案
试试这个。将 group by 与类别名称一起使用。我已按照您的指定注释掉了 created at 子句,如果您想使用它,可以取消注释它。
SELECT c.name, SUM(ABS(v.item_id))
FROM categories c,items i, votes v
WHERE c.name = i.name
AND i.item_id=v.item_id
--AND v.created_at > #{1.week.ago}
GROUP BY c.name
ORDER BY SUM(ABS(v.item_id)) DESC LIMIT 5;
您会注意到我没有使用 JOIN 关键字,而是仅使用 WHERE 子句过滤查询结果,这可能更容易理解。如果您想了解有关 JOIN 的更多信息,请访问 here is a tutorial 。
Here, too, is a tutorial on SQL aliases(AS 子句)。事实上,在这个站点上还有很多教程是针对一系列不依赖于平台的不同 SQL 主题的。
编辑: 根据评论修复,添加了 abs 功能,
关于SQL 查找最受欢迎的类别,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/1051927/