嗨,我们有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/

10-10 06:40