繁体   English   中英

左连接 - >聚合函数问题

[英]Left joins --> aggregate function problem

我的数据库中有四个不同的表:

线:

  • thread_id单
  • thread_content
  • 时间戳

thread_rating:

  • thread_rating_id
  • thread_id单
  • 喜欢
  • 不喜欢的

thread_report:

  • thread_report_id
  • thread_id单

thread_impression:

  • thread_impression_id
  • thread_id单

我将使用此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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM