【问题标题】:MYSQL SELECT DISTINCT songid, time ORDER BY TIMEMYSQL SELECT DISTINCT songid, time ORDER BY TIME
【发布时间】:2011-10-09 11:03:37
【问题描述】:

我的音乐网站主页上有一个正在收听的盒子,我有一个这样的表格:

id,userid,songid,time

现在每次用户播放歌曲时,歌曲的 id 和时间都会插入到 songid 字段中。所以有时我有重复的歌曲 ID(由不同的用户插入)。

现在这是我的 sql 语句:

SELECT DISTINCT songid,time FROM songs ORDER BY time DESC LIMIT 10

这给了我最近听过的十首歌,但有时它也会返回重复的数据!我该如何解决这个问题?在此先感谢

【问题讨论】:

  • 那么,如果在不同时间有同一首歌的多条记录,您希望显示哪个时间?

标签: mysql select distinct


【解决方案1】:

如果时间是歌曲最后播放的日期时间,您可以将 gons 与每个 gons 的最后播放时间分组:

SELECT songid,MAX(time)
FROM songs
GROUP BY songid
ORDER BY time DESC
LIMIT 10

【讨论】:

  • 这行不通。最有可能的是,它会跳过所有多次播放的歌曲。您不能依赖 GROUP BY 查询中未分组和未聚合字段的值。
  • @Quassnoi 分组查询中未分组和未聚合字段的结果确实是未定义的。但是,两者都不是以分组为条件的,因此不受影响。暗示多次播放会导致不正确的记录丢失。分组会影响 confitional MAX,它用于标识每首歌曲的最后播放,然后对其进行排序并选择最近的 10 首(即正是需要的)
  • 此查询:SELECT songid, time, MAX(time) FROM ( SELECT 1 AS songid, 1 AS time UNION ALL SELECT 1 AS songid, 2 AS time ) q GROUP BY songid HAVING time = MAX(time) 不返回任何内容,而使用 12 交换的相同查询返回结果。换句话说,它的结果取决于表中记录的物理顺序。播放歌曲的物理顺序很可能是按时间顺序排列的,因此首先播放的歌曲在堆/聚集索引中排在第一位,而播放两次或更多次的歌曲将被跳过。
  • @Quassnoi 那是因为您有一个额外的time 列,它受GROUP BY 的影响,就像您在之前的评论中突出显示的那样(未分组,未聚合)。添加时间列以允许HAVING 工作破坏了查询并且不是正确的表示。试试:SELECT songid, MAX(time) FROM ( SELECT 1 AS songid, 1 AS time UNION ALL SELECT 1 AS songid, 2 AS time ) q GROUP BY songid HAVING 2 = MAX(time)
  • 如果你没有注意到,我只是复制了你的查询。
【解决方案2】:

您需要聚合songid

SELECT songid, MAX(time) AS most_recent_time
FROM songs
GROUP BY songid
ORDER BY most_recent_time DESC
LIMIT 10

【讨论】:

  • 您应该通过most_recent_time 订购以获得正确的顺序。
  • 有什么办法可以提升这个查询,因为由于某种原因这会占用大量的mysql内存
【解决方案3】:
SELECT  *
FROM    songs s
WHERE   id =
        (
        SELECT  id
        FROM    songs si
        WHERE   si.songid = s.songid
        ORDER BY
                si.songid DESC, si.time DESC, si.id DESC
        LIMIT 1
        )
ORDER BY
        time DESC, id DESC
LIMIT 10

创建以下索引:

songs (songid, time, id)
songs (time, id)

让这个工作快速。

GROUP BY songid 解决方案不同,这不需要对songs 进行全表扫描或全索引松散扫描。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多