2012-06-26 3 views
0

У меня есть таблица со следующими полями и данными:Как получить последние 3 записи из таблицы

uid  message   created 
======= =============== ========== 
1  text1   1305244929 
2  text2   1305244930 
3  text3   1305244931 
1  text4   1305244932 
1  text5   1305244933 
3  text6   1305244934 
2  text7   1305244945 
1  text8   1305244956 
3  text9   1305244947 
1  text10   1305244948 
2  text11   1305244967 
1  text12   1305244968 
3  text13   1305244969 
1  text14   1305244970 
2  text15   1305244971 
3  text16   1305244972 
3  text17   1305244973 

Как получить последние 3 записей для каждого UID заказанного DESC по созданному

+2

В идеале, независимо от того, что эта таблица должна иметь свой собственный столбец «ИД», сохраняет реляционные отношения (если вы правильно ее разрабатываете) и делает вещи такими, какие вы хотите сделать легко :) – Brian

+0

Я думаю, что вашей таблице нужен первичный ключ. –

ответ

0

Это не проверен, но он должен сделать трюк:

SELECT uid, message, created FROM (
SELECT 
IF(@prev != q.uid, @rownum:=1, @rownum:[email protected]+1) as rownumber, @prev:=q.uid, q.* 
FROM (
    SELECT 
    uid, message, created 
    FROM yourTable yt 
    , (SELECT @rownum:=0, @prev:='') r 
    ORDER BY uid, created DESC 
)q 
)asdf 
WHERE asdf.rownumber <= 3 

Как и другие, первичный ключ был бы приятным для вашего стола.

+0

Для большой таблицы это займет много времени, чтобы получить результаты. Возможно, лучшее решение можно найти. –

+0

Поместите объединенный индекс в (uid, created) и посмотрите, поможет ли это. Без изменения схемы базы данных я сомневаюсь, что есть еще один способ ускорить это. – fancyPants

+0

@BoiculeseIuli Пробовали ли вы индексировать столбцы? Любая обратная связь? – fancyPants

Смежные вопросы