[英]SQL INNER JOIN of sum distinct values
我有 3 個表,分別稱為musics 、 singers和playlistInfos 。 我想獲得前 10 名聽過的英格蘭音樂。什么樣的 sql 查詢對我有幫助?
musics
musicID | singerID
1 1
2 1
3 2
singers
singerID | name | country
1 Adele England
2 Mozart Austria
3 DuaLipa England
playlistInfo
id | singerID | musicID | listened
1 1 1 25
2 3 3 15
3 2 2 20
SELECT * FROM 音樂 m INNER JOIN playlistInfo p ON p.musicID = m.id INNER JOIN 歌手 a ON a.id = m.singerID GROUP BY p.musicID ORDER BY p.listened
我嘗試了這個,但沒有得到我期望的結果。我該如何解決?
那么首先你的樣本數據是錯誤的。 所以首先讓我們創建正確的結構。
請記住,將來如果您共享 sql 腳本來創建您的示例數據,您將獲得更多答案。
-- declare tables
DECLARE @singers TABLE (singerID INT, name NVARCHAR(255), country NVARCHAR(255));
DECLARE @musics TABLE (musicID INT, singerID INT, songName NVARCHAR(255));
DECLARE @playlistInfo TABLE (singerID INT, musicID INT, listened INT);
-- Load sample data
INSERT INTO @singers VALUES (1, 'Adele', 'England'), (2, 'Mozart', 'Austria'), (3, 'DuaLipa', 'England')
INSERT INTO @musics VALUES (1, 1, 'Rolling in the Deep'), (2, 2, 'Symphony No 40'), (3, 3, 'One Kiss')
INSERT INTO @playlistInfo VALUES (1, 1, 25), (2, 2, 15), (3, 3, 20)
然后在我們的表格中查詢來自英格蘭的前 10 名歌手。
SELECT TOP 10
s.name as Singer, ISNULL(SUM(pl.listened), 0) as TotalListened
FROM
@singers s
LEFT JOIN @musics m ON m.singerID = s.singerID
LEFT JOIN @playlistInfo pl ON pl.musicID = m.musicID AND pl.singerID = m.singerID
-- I did left join to show anyone with 0 listen too, you can convert it to `JOIN`
WHERE
s.country = 'England'
GROUP BY
s.name
ORDER BY
SUM(pl.listened) DESC
一些額外的(如果你想獲得最多聽的歌曲)
-- get the most listened song within country
SELECT TOP 10
s.name as Singer, m.songName, ISNULL(SUM(pl.listened), 0) as TotalListened
FROM
@singers s
LEFT JOIN @musics m ON m.singerID = s.singerID
LEFT JOIN @playlistInfo pl ON pl.musicID = m.musicID AND pl.singerID = m.singerID
WHERE
s.country = 'England'
GROUP BY
s.name,
m.songName
ORDER BY
SUM(pl.listened) DESC
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.