2012-07-05 2 views
7

У меня есть таблица, содержащая комментарии пользователей, и я хочу получить последний комментарий, сделанный каждым пользователем.получение данных из отношения многих к db

запрос ниже, должен дать и представление о том, что я пытаюсь сделать

select comment, comment_id, userId FROM comments_table 
WHERE comment_id in (
    SELECT MAX(comment_id) 
    FROM comments_table where userId in (2001, 2002, 2010) 
    GROUP BY userId 
) 

Над работу запроса, но занимает слишком много времени, особенно если есть много UserIds.

Мне нужно более быстрое заявление запроса, которое выполняет одно и то же.

ответ

9

Используйте объединение вместо подзапроса:

SELECT 
    b.* 
FROM 
    (
     SELECT userid, MAX(comment_id) AS maxcomment 
     FROM comments_table 
     WHERE userid IN (2001, 2002, 2010) 
     GROUP BY userid 
    ) a 
INNER JOIN 
    comments_table b ON 
     a.userid = b.userid AND 
     a.maxcomment = b.comment_id 

Суб-выберите в этом запросе будет выполнять только один раз, в отличие от WHERE IN подзапроса, который будет выполнять для каждой строки в таблице комментариев.

+0

Сокращенное время запроса от 1сек до 0,0026. спасибо – user1502826

+0

, что мне нужно добавить к вышеуказанному запросу, если есть другая таблица с именем user_details как и что я хочу также извлечь столбцы u.mainimage и u.fullname, возможно, используя b.user_id = u.user_id – user1502826

+0

В какой таблице будет 'user_details' подключиться? Таблица комментариев? Таблица пользователей? –

0

Попробуйте с

  select comment, comment_id, userId FROM   comments_table WHERE userId in (2001, 2002, 2010) order by comment_id desc limit 1 

Try и посмотреть, если этот запрос эквивалентен с вашим с индексом на userid колонке, это должно выполнить более приличном

+0

Это позволит получить только одну строку: * самый последний комментарий, сделанный от любого из трех пользователей *. O.P. запрашивает последний комментарий *** каждого *** из трех пользователей, что означает, что вы должны выполнить групповой максимум для комментариев, сделанных каждым пользователем. –

0

Давайте держать это просто:

SELECT comment, MAX(comment_id), userId 
FROM comments_table 
WHERE userId IN (2001, 2002, 2010) 
GROUP BY userId; 
+0

Это решение вытащит самый последний 'comment_id' за' userid', но поле 'comment' не будет корректно соответствовать комментарию' comment_id'. –

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