У меня четыре запроса в одном запросе, и все они рассчитывают разные поля одной и той же таблицы. Когда я запускаю их, он отображает количество каждого из них выше 0, умноженное вместе, во все ячейки, в которых счетчик выше 0.
Я искал способы остановить пересечение графов.
DISTINCT: я пробовал разные, которые затем дают мне 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),
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 (ВЫБЕРИТЕ M1.AR1, COUNT (*) как AR1Count от ma 'в строке 16 ":
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
Может кто-нибудь, пожалуйста, помогите.
Спасибо.
Я понял это. Вам необходимо использовать подзапросы для дополнительных счетчиков, и тогда вам не нужны дополнительные объединения. Это заняло у меня несколько дней, так что, надеюсь, это может помочь кому-то еще.
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;
CASE
иSUM
, чтобы выполнить разные подсчеты для одного и того же запроса? Можете ли вы сказать нам, чего вы пытаетесь достичь?