我的数据库(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 的更多信息,这是一个教程.
这里还有一个关于 SQL 别名的教程(AS 条款)。事实上,这个网站上还有很多关于不依赖于平台的不同 SQL 主题的教程。
edit:根据评论修复,添加了abs函数,
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)