【问题标题】:Left joins --> aggregate function problem左连接 --> 聚合函数问题
【发布时间】:2011-09-21 07:05:50
【问题描述】:

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

线程:

  • 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 查询加入这些表

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

查询应该返回所有 thread_ids 以及计算出的喜欢和不喜欢、喜欢的百分比、时间戳、线程插入数据库的时间以及展示次数的百分比报告(时间、线程显示给用户)...

几乎所有结果都是正确的,唯一不正确的结果是喜欢和不喜欢。

如果我在查询前面加上一个 count(*),我可以看到,正确的结果的计数为 1,而错误的结果的计数有时高达 60。 好像有交叉连接问题...

我认为这是分组的问题,或者我应该接受联接。

我见过带有子选择的解决方案。但我不认为这是解决这个问题的好方法......

我在这里做错了什么?

【问题讨论】:

  • 请指明查询应该返回什么。如果可能,包括一个简单的例子。这将使其他人能够更好地回答您的问题。

标签: mysql sql database


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 2021-11-07
    • 1970-01-01
    • 2022-01-21
    • 2022-01-09
    • 2018-02-04
    • 2015-03-11
    • 1970-01-01
    • 1970-01-01
    • 2015-01-11
    相关资源
    最近更新 更多