MySQL子查询

MySQL子查询,mysql,optimization,subquery,Mysql,Optimization,Subquery,我们可以在没有子查询的情况下执行此查询吗 SELECT login, post_n, (SELECT SUM(vote) FROM votes WHERE votes.post_n=posts.post_n)AS votes, (SELECT COUNT(comments.post_n) FROM comments WHERE comments.post_n=posts.post_n)AS comments_count FROM users, posts WHERE posts.id=

我们可以在没有子查询的情况下执行此查询吗

SELECT login, post_n,

(SELECT SUM(vote) FROM votes WHERE votes.post_n=posts.post_n)AS votes, 
(SELECT COUNT(comments.post_n) FROM comments WHERE comments.post_n=posts.post_n)AS comments_count 

FROM users, posts 
WHERE posts.id=users.id AND (visibility=2 OR visibility=3) 
ORDER BY date DESC LIMIT 0, 15
表:

用户:id,登录名

Posts:post\n、id、可见性

投票:投票后


id-它是用户id,用户是主表。

您可以将投票总数和post计数存储在“用户”表中,并通过触发器或“更新”查询进行更新。

是的,可能:

SELECT login, post_n,

SUM(vote) as votes,

FROM users 
JOIN posts using(id)
LEFT JOIN votes using(post_n)
WHERE visibility=2 OR visibility=3 
GROUP BY login, post_n
然后将结果展平:

select * from 
(
    SELECT login, post_n,

    SUM(vote) as votes,

    FROM users 
    LEFT JOIN posts using(id)
    LEFT JOIN votes using(post_n)
    WHERE visibility=2 OR visibility=3 
    GROUP BY login, post_n
) as votes_count
然后加入评论:

select votes_count.login, votes_count.post_n, votes_count.votes, 

    COUNT(comments.post_n) as comments_count

from 
(
    SELECT login, post_n,

    SUM(vote) as votes,

    FROM users 
    LEFT JOIN posts using(id)
    LEFT JOIN votes using(post_n)
    WHERE visibility=2 OR visibility=3 
    GROUP BY login, post_n
) as votes_count
LEFT JOIN comments using(post_n)
GROUP BY votes_count.login, votes_count.post_n
ORDER BY date DESC LIMIT 0, 15

当我们使用join或where合并表时,我测试了变量和测试变量

没有比这更慢的子查询,0.0208秒,mysql只使用投票表中的271行,但当我使用联接时,它使用整行。此处没有子查询变量:

SELECT res.*, COUNT(*) FROM
(
  SELECT login, posts.post_n, SUM(vote)AS votes
  FROM users, posts, votes
  WHERE users.id=posts.id AND posts.post_n=votes.post_n AND visibility=3
  GROUP BY posts.post_n
)AS res, comments
WHERE comments.post_n=res.post_n
GROUP BY res.post_n
ORDER BY date DESC
LIMIT 0, 15
瓦里安的子查询只执行了0.0027秒,它没有缓存,但在所有测试中都使用索引


p、 美国。对不起,我的英语不好

可见性属于哪一个表?我在一分钟前的帖子中已经回答了。看起来它没有子查询,但它有子查询。请参阅它不是子查询(其中查询在3个表上来回乒乓)。这叫做表派生,表派生更有效。但如果MySQL已经有了表派生,那么表派生就更优雅了CTE@Maksim:尝试区分表派生(高效)和子查询(低效)之间的区别尝试体验一流的表派生,下载MSSQL或Postgresql和google CTE(公共表表达式)。不幸的是,MySQL还没有CTE,所以您必须通过将其括在括号中从其他查询中提取中间结果,这称为表派生,而不是子查询HOHOH,它不起作用,错误。它真的会更快吗?thx求救