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求救