我的数据库(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'.
试试这个.使用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功能,