我在一个查询中有四个计数,所有计数都在计数同一表的不同字段。当我运行它们时,它会在计数大于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
有人可以帮忙吗?
谢谢。
答案 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;