2016-03-02 3 views
0

У меня есть таблица SQL, написанная несколькими внешними пользователями. Каждый пользователь имеет свой собственный идентификатор и регистрирует одно сообщение за раз. Каждая строка в этой таблице имеет поле автоинкремента, называемое message_id. Другими словами, каждая строка в таблице имеет свой собственный уникальный идентификатор. Поэтому, если бы кто-то сортировал таблицу по столбцу message_id, он получал все сообщения, отсортированные в хронологическом порядке.Найти уникальные столбцы с критериями

Есть ли одна команда SQL, которая может возвращать последние сообщения, регистрируемые каждым пользователем?

я могу сделать это в два этапа:

  1. Получить список user_ids.
  2. Для каждого user_id:

    SELECT * 
    FROM myTABLE AS T WHERE T.user_id=user_id 
    ORDER BY message_id DESC 
    LIMIT 1 
    

Но я думаю, что есть лучший путь.

Благодаря

+0

Doh ... Я не мог придумать правильные слова для поиска. благодаря – aghoras

ответ

0

Одним из способов является join или where условие:

select t.* 
from mytable t 
where t.id = (select max(t2.id) from mytable t2 where t2.user_id = t.user_id); 

Для лучшей производительности, вы хотите индекс на mytable(user_id, id).

Без такого индекса, вы, возможно, лучше от с явной join:

select t.* 
from mytable t join 
    (select max(id) as maxid 
     from mytable t2 
     group by user_id 
    ) tt 
    on t.id = tt.maxid; 
0

Если я понять ваш вопрос правильно, вы пытаетесь выполнить один запрос, который будет захватывать ограниченное число результаты для каждого user_id. Я нашел этот вопрос, который может быть полезен.

Using LIMIT within GROUP BY to get N results per group?

Edit: После изучения этого немного больше, кажется, как будто это сложная вещь, чтобы достичь в MySQL. Если вы не изо всех сил пытаетесь найти повышение производительности, я думаю, вы бы отлично справились с циклом, чтобы запросить таблицу для каждого пользователя, для которого вам нужны данные. Конечно, это зависит от того, сколько у вас данных и сколько у них пользователей.

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