简体   繁体   English

左联接使来自不同表的两个计数具有相同的值

[英]Left Join makes two counts from different tables the same value

I have a very long query with a lot of LEFT JOINS in. The problem is that I have two COUNTS which do not seem to work together. 我有一个很长的查询,里面有很多LEFT JOINS。问题是我有两个COUNTS,它们似乎不能一起工作。 Both the counts will equal the same value even if they're not. 即使它们不同,两个计数将等于相同的值。

Here's what I have; 这就是我所拥有的;

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

I won't explain all the query but I think you'll get the gist of it. 我不会解释所有查询,但我想您会领会到它的要旨。 The JOINS in question are the last two. 有问题的JOINS是最后两个。 If COUNT(P.T_ID) = 100 COUNT(L.T_ID) will also = 100 . 如果COUNT(P.T_ID) = 100 COUNT(L.T_ID)也将= 100

Thanks in advance! 提前致谢!

You should try using COUNT(DISTINCT) 您应该尝试使用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

You might try "rephrasing" those counts as correlated subqueries: 您可以尝试将这些计数“重述”为相关子查询:

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

I find this to be simpler to understand/maintain and often faster. 我发现这更容易理解/维护,而且通常更快。

Both COUNTs have no WHERE clause and appear in the same table, namely the result table. 这两个COUNT没有WHERE子句,并出现在同一表即结果表中。 Therefore both report the total number of rows of the resulting table. 因此,两者都报告结果表的总行数。

May be i am wrong, but you just count # of thevresult rows, isn't it? 可能是我错了,但是您只计算了#vresult行,不是吗?

May be you need to change count to be like 可能是您需要更改计数才能像

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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