希望有人能帮忙。MySQL的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,但我不能得到任何答案与我的表/查询工作(可能是因为我没有完全掌握JOIN
的)
任何帮助都能让我省去一大堆头痛!
只需连接两个表并添加聚合函数。
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
,所以即使没有投票,也会显示详细信息。
我已经测试了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