嗨我们在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
第3表:
第3个表用于存在歌曲细节的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
。
答案 0 :(得分:0)
您需要确定前两行的具体顺序。它们在视觉上看起来的顺序应该与正确规范化的数据库无关。
对于这个例子,假设您想要找到每个播放列表中“两个最低的歌曲ID”。这是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示例。