JOIN
语句从来都不是我的强项,它们只会伤害我的大脑,试图解决它们。
我有一个表,用于存储另一个表中项目的评级,并按ID跟踪。
我现在需要做的是显示按评级排序的项目列表,从高到低,从低到高。
我可以获得每个项目的评分列表,很容易从评级表中按ID分组,但它会加入到我坚持的项目中。并非所有项目都具有(尚未)评级,因此如果组合列表不会在确实存在的评级结束时停止,那么也将是有益的。
好的,所以这是我的分组声明:
SELECT `themeID` , SUM( `rating` ) AS ratings
FROM `votes`
GROUP BY `themeID`
ORDER BY `ratings` DESC
输出
themeID ratings
1 6
3 3
2 2
6 2
然后details
表格包含各种信息,例如id
,filename
,name
,date
等
在两个表之间,themeID
和id
与它们相同。我已经查看了SO上类似查询的其他一些答案,但我无法得到任何与我的表/查询一起使用的答案(可能是因为我没有完全掌握{{ 1}}' S)
任何帮助都会让我头疼不已!
答案 0 :(得分:2)
只需加入两个表并添加聚合函数。
SELECT d.id, d.filename, d.name, IFNULL(SUM(v.rating), 0) AS ratings
FROM details AS d
LEFT JOIN votes AS v ON d.id = v.themeID
GROUP BY d.id
我使用LEFT JOIN
所以即使没有投票也会显示详细信息。
答案 1 :(得分:2)
我已经在sql server中测试了同样可以在Mysql中获取
DROP TABLE #Item
create table #Item (ID int identity(1,1),ItemNAme varchar(10))
INSERT INTO #Item(ItemNAme)
SELECT 'A'
UNION ALL
SELECT 'B'
UNION ALL
SELECT 'C'
DROP TABLE #ItemRating
create table #ItemRating (ItemID int ,rating int)
INSERT INTO #ItemRating(ItemID,rating)
SELECT 3,2
UNION ALL
SELECT 2,11
UNION ALL
SELECT 1, 3
UNION ALL
SELECT 2, 4
union all
SELECT 1,5
UNION ALL
SELECT 3,12
UNION ALL
SELECT 1, 4
UNION ALL
SELECT 2, 1
SELECT m.ItemNAme,SUM(I.rating) as Rating
FROM #Item m INNER JOIN #ItemRating I ON m.ID=I.ItemID
group by m.ItemNAme
ORDER BY SUM(I.rating) asc
--OR same thing can achive
SELECT ItemNAme, Rating
FROM (
SELECT m.ItemNAme,SUM(I.rating) as Rating
FROM #Item m INNER JOIN #ItemRating I ON m.ID=I.ItemID
group by m.ItemNAme
)P
ORDER BY Rating Desc