MYSQL SELECT DISTINCT songid, время ПОРЯДОК ПО ВРЕМЕНИ - PullRequest
2 голосов
/ 20 июля 2011

У меня в данный момент есть окно прослушивания на домашней странице моего музыкального сайта, и у меня есть таблица, подобная этой:

id,userid,songid,time

Теперь каждый раз, когда пользователь воспроизводит песню, ее идентификатор вставляется.в поле songid, а также время.поэтому иногда у меня есть дубликат songid (вставленный разными пользователями).

Теперь вот мое заявление sql:

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

, которое дает мне последние десять прослушанных песен, однако иногда оно возвращаетдубликаты данных тоже!как я могу решить эту проблему?Заранее спасибо

Ответы [ 3 ]

4 голосов
/ 20 июля 2011

Вы хотите агрегировать по songid:

SELECT songid, MAX(time) AS most_recent_time
FROM songs
GROUP BY songid
ORDER BY most_recent_time DESC
LIMIT 10
4 голосов
/ 20 июля 2011

Если время - это дата, когда песня была в последний раз проиграна, вы можете сгруппировать гоны с последним, когда каждый из них играл:

SELECT songid,MAX(time)
FROM songs
GROUP BY songid
ORDER BY time DESC
LIMIT 10
1 голос
/ 20 июля 2011
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.

...