嗨,我们有3张音乐表,在MySql
中是这样的:
第一表:
第一个表用于存在音乐播放列表的playlist
表。
playlistId playlistTitle categoryId
1 hello 0
2 wow 0
3 wi-fi 0
4 awesome 0
5 sixer 1
6 four 1
7 boundary 2
第二表:
第二个表用于
songRelation
表,其中每个播放列表都与他们的歌曲相关联playlistId songId
1 4
1 3
1 43
1 57
1 98
2 56
2 67
2 90
2 78
3 98
3 78
3 89
43 90
第三表:
第三个表用于存在歌曲详细信息的
song
表songId songTitle
4 hello
3 real hero
43 singalone
57 awesom
98 really
78 sakaka
98 shikwa
89 moha
90 hello2
67 Sneh
实际上我想得到这样的结果:
playlistId songId categoryId songTitle
1 4 0 hello
1 3 0 real hero
2 56 0 singalone
2 67 0 Sneh
3 78 0 sakaka
3 98 0 Shikwa
其中每个
playlistId
将与他们的第一个2
songId
以及他们的categoryId
以及songTitle
一起。 最佳答案
您将需要确定前两行的具体顺序。在适当规范化的数据库中,它们在视觉上出现的顺序应该无关紧要。
对于此示例,假设您要查找“每个播放列表中的两个最低SongId”。这是一个greatest-n-per-group问题,该标签上还有许多其他问题。
您可以使用以下查询进行操作:
SELECT s.playlistId, s.songId
FROM songRelation s
WHERE(
SELECT COUNT(*)
FROM songRelation s2
WHERE s.playlistId = s2.playlistId AND s.songId >= s2.songId) <= 2;
末尾的2表示每个组所需的行数(每个播放列表2首歌曲),子查询中的条件提取两个最小的songIds。如果需要两个最大的,只需将其更改为
s.songId <= s2.songId
。现在,要获取类别信息,您只需加入播放列表表:SELECT p.id, t.songId, p.categoryId
FROM playlist p
JOIN(
SELECT s.playlistId, s.songId
FROM songRelation s
WHERE(
SELECT COUNT(*)
FROM songRelation s2
WHERE s.playlistId = s2.playlistId AND s.songId >= s2.songId) <= 2) t ON t.playlistId = p.id;
请注意,使用此特定样本数据,表中没有播放列表43,因此我的结果将不会返回该播放列表。
这是一个SQL Fiddle示例。
关于mysql - 如何从组中选择前两行,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/32104689/