繁体   English   中英

带有LIMIT替代项的MySQL子查询

[英]MySQL subquery with LIMIT alternative

我想要的是:

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 ,因此无法使用。 我想保持子查询的顺序,但是我想获取usernamelast_activity而不是user_id

有什么建议我可以实现这一目标吗?

用视图替换子查询:

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);

为什么不JOIN呢? 由于WHERELIMIT子句相同,因此似乎对性能没有影响。 它不会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

您可以对表和子查询使用join ,而不是在where in使用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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM