[英]Left joins --> aggregate function problem
我的数据库中有四个不同的表:
线:
thread_rating:
thread_report:
thread_impression:
我将使用此SQL-Query加入这些表
SELECT t.thread_id,
t.thread_content,
SUM(tra.liked) AS liked,
SUM(tra.disliked) AS disliked,
t.timestamp,
((100*(tra.liked + SUM(tra.liked))) / (tra.liked + SUM(tra.liked) + (tra.disliked + SUM(tra.disliked)))) AS liked_percent,
((100*(COUNT(DISTINCT tre.thread_report_id)) / ((COUNT(DISTINCT ti.thread_impression_id))))) AS reported_percent
FROM thread AS t
LEFT JOIN thread_rating AS tra ON t.thread_id = tra.thread_id
LEFT JOIN thread_report AS tre ON tra.thread_id = tre.thread_id
LEFT JOIN thread_impression AS ti ON tre.thread_id = ti.thread_id
GROUP BY t.thread_id
ORDER BY liked_percent
Query应该返回所有thread_id,其中包含计算出的喜欢和不喜欢的内容,以百分比表示的喜欢,时间戳,线程插入数据库的时间以及报告的百分比(展示次数,时间,线程都显示给用户)。 ..
几乎所有结果都是正确的,唯一不合适的结果是喜欢和不喜欢。
如果我在查询前面加上一个count(*),我可以看到,正确的结果计数为1,错误的结果有时计数最多为60.看起来有交叉连接问题.. 。
我认为这是分组的问题,或者我应该接受联接。
我见过带有子选择的解决方案。 但我认为这不是解决这个问题的好方法......
我在这做错了什么?
tra
表每个thread_id有多个记录。 这导致SUM
函数中的双重计数。
在子选择中进行求和,按连接字段分组。
这样,你只需要在tra2
有一个thread_id加入,并避免重复行。
SELECT t.thread_id,
t.thread_content,
tra2.liked
tra2.disliked,
t.timestamp,
tra2.liked_percent,
((100*(COUNT(DISTINCT tre.thread_report_id)) / ((COUNT(DISTINCT ti.thread_impression_id))))) AS reported_percent
FROM thread AS t
LEFT JOIN (
SELECT
tra.thread_id
, SUM(tra.liked) AS liked
, SUM(tra.disliked) AS disliked
, ((100*(tra.liked + SUM(tra.liked))) / (tra.liked + SUM(tra.liked) + (tra.disliked + SUM(tra.disliked)))) AS liked_percent
FROM thread_rating AS tra
GROUP BY tra.thread_id
) as tra2 ON t.thread_id = tra2.thread_id
LEFT JOIN thread_report AS tre ON tra.thread_id = tre.thread_id
LEFT JOIN thread_impression AS ti ON tre.thread_id = ti.thread_id
GROUP BY t.thread_id
ORDER BY liked_percent DESC
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.