1

我有一个很长的查询,其中包含很多 LEFT JOINS。问题是我有两个似乎不能一起工作的 COUNTS。即使它们不是,两个计数都将等于相同的值。

这就是我所拥有的;

SELECT T.ID,
       T.name,
       T.pic,
       T.T_ID,
       COUNT(P.T_ID) AS plays,
       COUNT(L.T_ID) AS likes,
       S.Status,
       G.gig_name,
       G.date_time,
       G.lineup,
       G.price,
       G.ticket,
       E.action,
       E.ID,
       E.timestamp,
       E.E_ID
  FROM events E
       LEFT JOIN TRACKS T
       ON T.ID = E.ID AND E.action = 'has uploaded a track.' AND E.E_ID = T.T_ID
       LEFT JOIN STATUS S
       ON S.ID = E.ID AND E.action = 'has some news.' AND E.E_ID = S.S_ID
       LEFT JOIN GIGS G
       ON G.ID = E.ID AND E.action = 'has posted a gig.' AND E.E_ID = G.G_ID
       LEFT JOIN track_plays P
       ON P.A_ID = E.ID AND E.action = 'has uploaded a track.' AND E.E_ID = P.T_ID
       LEFT JOIN track_likes L
       ON L.ID = E.E_ID AND E.action = 'has uploaded a track.'
 WHERE E.ID = '3'
 GROUP BY E.E_ID
 ORDER BY E.timestamp DESC LIMIT 15

我不会解释所有的查询,但我想你会明白它的要点。有问题的 JOINS 是最后两个。如果COUNT(P.T_ID)=100 COUNT(L.T_ID)也会 = 100

提前致谢!

4

4 回答 4

1

你应该尝试使用COUNT(DISTINCT)

SELECT T.ID,
       T.name,
       T.pic,
       T.T_ID,
       COUNT(DISTINCT P.T_ID) AS plays,
       COUNT(DISTINCT L.T_ID) AS likes,
       S.Status,
       G.gig_name,
       G.date_time,
       G.lineup,
       G.price,
       G.ticket,
       E.action,
       E.ID,
       E.timestamp,
       E.E_ID
  FROM events E
       LEFT JOIN TRACKS T
       ON T.ID = E.ID AND E.action = 'has uploaded a track.' AND E.E_ID = T.T_ID
       LEFT JOIN STATUS S
       ON S.ID = E.ID AND E.action = 'has some news.' AND E.E_ID = S.S_ID
       LEFT JOIN GIGS G
       ON G.ID = E.ID AND E.action = 'has posted a gig.' AND E.E_ID = G.G_ID
       LEFT JOIN track_plays P
       ON P.A_ID = E.ID AND E.action = 'has uploaded a track.' AND E.E_ID = P.T_ID
       LEFT JOIN track_likes L
       ON L.ID = E.E_ID AND E.action = 'has uploaded a track.'
 WHERE E.ID = '3'
 GROUP BY E.E_ID
 ORDER BY E.timestamp DESC LIMIT 15
于 2013-05-03T17:53:03.047 回答
1

您可以尝试将这些计数“改写”为相关子查询:

SELECT T.ID,
       T.name,
       T.pic,
       T.T_ID,
       (SELECT COUNT(*) FROM track_plays WHERE A_ID = E.ID AND E.action = 'has uploaded a track.' AND E.E_ID = T_ID) AS plays,
       (SELECT COUNT(*) FROM track_likes WHERE ID = E.E_ID AND E.action = 'has uploaded a track.') AS likes,
       S.Status,
       G.gig_name,
       G.date_time,
       G.lineup,
       G.price,
       G.ticket,
       E.action,
       E.ID,
       E.timestamp,
       E.E_ID
  FROM events E
       LEFT JOIN TRACKS T
       ON T.ID = E.ID AND E.action = 'has uploaded a track.' AND E.E_ID = T.T_ID
       LEFT JOIN STATUS S
       ON S.ID = E.ID AND E.action = 'has some news.' AND E.E_ID = S.S_ID
       LEFT JOIN GIGS G
       ON G.ID = E.ID AND E.action = 'has posted a gig.' AND E.E_ID = G.G_ID
 WHERE E.ID = '3'
 GROUP BY E.E_ID
 ORDER BY E.timestamp DESC LIMIT 15

我发现这更容易理解/维护,而且通常更快。

于 2013-05-03T17:54:32.330 回答
0

两个 COUNT 都没有 WHERE 子句,出现在同一张表中,即结果表中。因此,两者都报告结果表的总行数。

于 2013-05-03T17:50:52.107 回答
0

可能是我错了,但你只计算 # 的结果行,不是吗?

可能是你需要改变计数

select count(P_ID) from track_plays where p_id = E.ID

于 2013-05-03T18:02:22.710 回答