SQL group by降序id顺序

时间:2017-11-16 12:47:40

标签: php mysql laravel

+----+--------+-------------+
| id |  song  | time_played |
+----+--------+-------------+
|  1 | song_1 |  1510837544 |
|  2 | song_2 |  1510837545 |
|  3 | song_3 |  1510837546 |
|  4 | song_2 |  1510837547 |
|  5 | song_1 |  1510837548 |
|  6 | song_2 |  1510837549 |
+----+--------+-------------+

这样的预期结果

+--------+-------------+-------+
|  song  | time_played | count |
+--------+-------------+-------+
| song_2 |  1510837549 |     3 |
| song_1 |  1510837548 |     2 |
| song_3 |  1510837546 |     1 |
+--------+-------------+-------+

我正在使用Laravel收音机网站。播放的每首歌曲都存储在名为last_played的表格中。我们得到了一个名为Top 20的页面,它基本上应该显示前20首最常播放的歌曲以及它们最后播放的时间。

我们使用的查询如下:

$top20 = DB::select(DB::raw('SELECT *,
  COUNT(*) AS count FROM last_played
   GROUP BY song ORDER BY COUNT(*) DESC LIMIT 20'));

在我们播放歌曲之前,一切顺利。它们按播放次数正确显示,但每首歌曲返回的ID最低。我们希望将所有内容分组并获得最多播放的歌曲数量,并返回该歌曲的最后一个ID。

这里有前20页的链接,你可以看到" Sist spillt / last playing"是第一次播放的歌曲,而不是最后一首。

任何人都知道如何解决这个问题?

2 个答案:

答案 0 :(得分:0)

SELECT 
    song, COUNT(*) AS count, MAX(time_played) AS timeplayed
FROM
    song
GROUP BY song
ORDER BY timeplayed DESC, count DESC
LIMIT 20;

我不确定我是否得到了你的问题。但这适用于您当前的示例数据。

答案 1 :(得分:-1)

这应该有效:

SELECT song, COUNT(song) AS count, MAX(time_played) FROM last_played GROUP BY song ORDER BY COUNT(song) DESC LIMIT 0,20