我有两张table talk_comments
以及 talk_comment_votes
.
我运行以下代码来选择, commentId
, numberOfUpvotes
, whetherUserUpvoted
, numberOfDownvotes
, whetherUserDownvoted
usin左联接到同一个表。
SELECT c.id, COUNT(v1.id) as upvotes, COUNT(v2.id) as userUpvoted, COUNT(v3.id) as downvotes, COUNT(v4.id) as userDownvoted FROM talk_comments c
LEFT JOIN talk_comment_votes v1 ON v1.comment_id = c.id AND v1.status = 1
LEFT JOIN talk_comment_votes v2 ON v2.comment_id = c.id AND v2.status = 1 AND v2.user_id = 1 AND v2.is_anonymous = 0
LEFT JOIN talk_comment_votes v3 ON c.id = v3.comment_id AND v3.status = 2
LEFT JOIN talk_comment_votes v4 ON c.id = v4.comment_id AND v4.status = 2 AND v4.user_id = 1 AND v4.is_anonymous = 0
WHERE c.id = 2 GROUP BY c.id
在我的talk\u comment\u Voces表中有以下数据
因此,根据查询,它应该选择值 2,2,0,1,1
分别。当我中断这些join语句并执行查询时,它将返回预期的结果。但是,对于连接,它返回如下所示的内容。
能帮我修一下吗?
谢谢。
2条答案
按热度按时间bxgwgixi1#
我在基于@spencer7593和@raymondnijland的2个答案的查询上运行了一个基准测试。
左加入获胜!
1. 使用左连接
1000次查询时间:0.55000805854797s
2. 使用子查询
1000个查询的时间:0.95499300956726s
3. 使用总和,如果
1000次查询时间:1.2266919612885s
谢谢你的回答。
gpfsuwkq2#
我会使用条件聚合。对单个引用的联接
tall_comment_votes
,然后检查表达式中的条件。当v1、v2、v3和v4返回多个行时,这避免了部分叉积的问题。
mysql
IF()
表达式可以替换为更符合ansi标准的表达式CASE
表达式,例如。后续行动
设置测试用例并观察执行计划和性能
填充表格
查询执行计划
explain输出
测量性能: