首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用LIMIT替代的MySQL子查询

使用LIMIT替代的MySQL子查询
EN

Stack Overflow用户
提问于 2015-04-07 06:19:57
回答 3查看 867关注 0票数 0

我想要的:

代码语言:javascript
复制
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

有什么建议可以让我做到这一点吗?

EN

回答 3

Stack Overflow用户

发布于 2015-04-07 06:26:22

将子查询替换为视图:

代码语言:javascript
复制
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
EN

Stack Overflow用户

发布于 2015-04-07 06:29:18

你为什么不用JOIN来做呢?这似乎不会影响性能,因为WHERELIMIT子句是相同的。它不会JOIN整个表:

代码语言:javascript
复制
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
EN

Stack Overflow用户

发布于 2015-04-07 06:37:10

您可以不使用where in,而是对表和子查询使用join

代码语言:javascript
复制
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
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29480614

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档