【发布时间】: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。 好像有交叉连接问题...
我认为这是分组的问题,或者我应该接受联接。
我见过带有子选择的解决方案。但我不认为这是解决这个问题的好方法......
我在这里做错了什么?
【问题讨论】:
-
请指明查询应该返回什么。如果可能,包括一个简单的例子。这将使其他人能够更好地回答您的问题。