SQL查找最受欢迎的类别

Bri*_*ong 4 mysql sql

我的数据库(MySQL)中有3个表.

categories (name:string)
items (name:string, category_id:int)
votes (value:int, item_id:int, created_at:datetime)
Run Code Online (Sandbox Code Playgroud)

所以一个类别有很多项目,一个项目有很多选票.

我想编写一个查询来获取最受欢迎的类别,这意味着获取其项目在过去一周内获得最多票数(向上或向下)的类别.

我开始尝试更简单的东西,只是获得受欢迎的项目,但我真的只是猜测这一点,它不起作用.

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;
Run Code Online (Sandbox Code Playgroud)

我真的不知道我在做什么,有什么想法吗?此外,如果有人知道如何做更好的高级选择,我很乐意阅读它.MySQL文档有点神秘,我不太了解'AS'和'JOINS'.

akf*_*akf 5

试试这个.使用group by和类别的名称.我已按照您的指定注释掉了创建的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;
Run Code Online (Sandbox Code Playgroud)

您会注意到我没有使用JOIN关键字,而是仅使用WHERE子句过滤查询结果,这可能更容易理解.如果你想了解更多关于JOIN的信息, 这里有一个教程.

这里也是关于SQL别名(AS子句)的教程.事实上,在这个网站上有很多教程可以用于一系列不依赖于平台的不同SQL主题.

编辑: 根据评论修复,添加了abs功能,