如何从组

时间:2015-08-19 20:06:31

标签: mysql sql

嗨我们在MySql

中有3个音乐表

第一张表:

第一个表用于存在音乐播放列表的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以及categoryIdsongTitle

1 个答案:

答案 0 :(得分:0)

您需要确定前两行的具体顺序。它们在视觉上看起来的顺序应该与正确规范化的数据库无关。

对于这个例子,假设您想要找到每个播放列表中“两个最低的歌曲ID”。这是问题,该标记还有许多其他问题。

您可以使用以下查询执行此操作:

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示例。

相关问题