2015-04-06 3 views
0

Что я хочу:MySQL подзапрос с LIMIT альтернативой

SELECT u.username, u.last_activity 
FROM users_userprofile 
WHERE u.id IN (
    SELECT DISTINCT(p.user_id) FROM forums_post p 
    WHERE p.thread_id = 423993 
    ORDER BY p.created_at DESC 
    LIMIT 4 
); 

Это не работает из-за LIMIT в подзапросе. Я хочу сохранить порядок подзапроса, но хочу получить username и last_activity вместо user_id.

Любое предложение, как я мог бы достичь этого?

ответ

0

Заменить подзапрос с целью:

CREATE VIEW subv AS  SELECT p.user_id FROM forums_post p 
WHERE p.thread_id = 423993 
ORDER BY p.created_at DESC 
LIMIT 4; 

SELECT u.username, u.last_activity 
FROM users_userprofile 
WHERE u.id IN (SELECT * FROM subv); 
0

Почему woldn't вы делаете это с JOIN? Похоже, что влияние на производительность отсутствует, потому что статьи WHERE и LIMIT те же. Это не JOIN целые таблицы:

SELECT p.user_id, u.username, u.last_activity 
FROM users_userprofile u 
JOIN forums_post p ON p.user_id = u.id 
WHERE p.thread_id = 423993 
GROUP BY p.user_id ORDER BY MAX(p.created_at) DESC 
LIMIT 4 
+0

Sry, я забыл DISTINCT (p.user_id) в моем оригинале вопрос. – Spindel

+0

@ Спиндель, обновил код. Он также должен работать с DISTINCT. –

+0

Это был первый запрос, который я пробовал, но, к сожалению, он не ORDER BY p.created (это похоже на случайный порядок). – Spindel

0

вы могли бы использовать join для таблицы и подзапроса вместо использования where in:

SELECT u.username, u.last_activity 
FROM users_userprofile u 
JOIN (
     SELECT p.user_id FROM forums_post p 
     WHERE p.thread_id = 423993 
     ORDER BY p.created_at DESC 
     LIMIT 4 
    ) q 
on u.user_id=q.user_id 
+0

Sry, я забыл DISTINCT (p.user_id) в моем исходном вопросе. – Spindel

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