多个计数,试图将它们分开,但它们相乘

时间:2019-03-28 15:10:58

标签: mysql

我在一个查询中有四个计数,所有计数都在计数同一表的不同字段。当我运行它们时,它会在计数大于0的所有单元格中将大于0的每个数都放大。

我研究了阻止计数交叉的方法。

DISTINCT: 我尝试了distinct,如果数字大于0,则给我一个1,否则返回0。

子查询: 我尝试过此操作,即使使用不同的别名,使用同一张表也会遇到代码问题。

原始查询:

SELECT 
  CONCAT(lastname,', ', firstname), 
  A.gender, 
  DATE_FORMAT(dob, '%d %b %y'), 
  DATE_FORMAT(dod, '%d %b %y'), 
  CASE WHEN NOT dod = '0000-00-00' then TIMESTAMPDIFF(year,dob,dod) else 
TIMESTAMPDIFF(year,dob,Curdate()) end, 
  B.Name, 
  COUNT(M.REF),
  COUNT(M1.AR1),
  COUNT(M2.AR2),
  COUNT(M3.TMO),
  refID 
FROM 
  refs A 
LEFT JOIN 
  teams B 
ON 
  A.Nationality=B.TeamID 
LEFT JOIN 
  matches M 
ON 
  A.refID=M.REF 
LEFT JOIN 
  matches M1 
ON 
  A.refID=M1.AR1
LEFT JOIN 
  matches M2 
ON 
  A.refID=M2.AR2 
LEFT JOIN 
  matches M3 
ON 
  A.refID=M3.TMO
GROUP BY 
  refID
ORDER BY 
  lastname 

问题所在是这里

COUNT(M.REF),
COUNT(M1.AR1),
COUNT(M2.AR2),
COUNT(M3.TMO),

我已经尝试过了,只能得到1或0:

COUNT(distinct M.REF) as refCount,
COUNT(distinct M1.AR1) as AR1Count,
COUNT(distinct M2.AR2) as AR2Count,
COUNT(distinct M3.TMO) as TMOCount,

我尝试了此操作,并收到错误消息“您的SQL语法有错误;请查看与您的MySQL服务器版本相对应的手册,以获取正确的语法,以在'M ON A.refID = M.REF LEFT JOIN附近使用(从第16行的ma'中选择M1.AR1,COUNT(*)作为AR1Count:

  refCount,
  AR1Count,
  AR2Count,
  TMOCount,
  refID 
FROM 
  refs A 
LEFT JOIN
  (SELECT M.REF, COUNT(*) as refCount from matches M GROUP BY REF) matches M ON A.refID = M.REF 
LEFT JOIN
  (SELECT M1.AR1, COUNT(*) as AR1Count from matches M1 GROUP BY AR1) matches M1 ON A.refID = M1.AR1
LEFT JOIN
  (SELECT M2.AR2, COUNT(*) as AR2Count from matches M2 GROUP BY AR2) matches M2 ON A.refID = M2.AR2 
LEFT JOIN
  (SELECT M3.TMO, COUNT(*) as TMOCount from matches M3 GROUP BY TMO) matches M3 ON A.refID = M3.TMO 

有人可以帮忙吗?

谢谢。

1 个答案:

答案 0 :(得分:0)

我知道了。您需要将子查询用于其他计数,然后就不需要其他联接。这花了我几天的时间,因此希望可以对其他人有所帮助。

SELECT 
  CONCAT(lastname,', ', firstname), 
  A.gender, 
  DATE_FORMAT(dob, '%d %b %y'), 
  DATE_FORMAT(dod, '%d %b %y'), 
  CASE WHEN NOT dod = '0000-00-00' then TIMESTAMPDIFF(year,dob,dod) else 
  TIMESTAMPDIFF(year,dob,Curdate()) end, 
  B.Name, 
  COUNT(M.REF) AS refCount,
  (SELECT COUNT(M.AR1) from matches M WHERE M.AR1=A.refID) AS AR1Count,
  (SELECT COUNT(M.AR2) from matches M WHERE M.AR2=A.refID) AS AR2Count,
  (SELECT COUNT(M.TMO) from matches M WHERE M.TMO=A.refID) AS TMOCount,
  refID 
FROM 
  refs A 
LEFT JOIN 
  teams B 
ON 
  A.Nationality=B.TeamID 
INNER JOIN 
  matches M 
ON
  A.refID=M.REF
GROUP BY 
  refID
ORDER BY 
  lastname;