Несколько счетов, пытаясь держать их отдельно, но они умножаются вместе

0

У меня четыре запроса в одном запросе, и все они рассчитывают разные поля одной и той же таблицы. Когда я запускаю их, он отображает количество каждого из них выше 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 

Может кто-нибудь, пожалуйста, помогите.

Спасибо.

  • 0
    Вы пытались использовать CASE и SUM , чтобы выполнить разные подсчеты для одного и того же запроса? Можете ли вы сказать нам, чего вы пытаетесь достичь?
  • 0
    в общем случае это не то, как вы должны писать запрос GROUP BY .. "SQL-92 и более ранние версии не разрешают запросы, для которых список выбора , условие HAVING или список ORDER BY ссылаются на неагрегированные столбцы , которые не названы в GROUP Предложение BY, которое вы здесь делаете без структур таблиц, мы не можем знать, смог ли MySQL использовать функционально зависимые для получения правильных данных.
Показать ещё 2 комментария
Теги:

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) 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; 

Ещё вопросы

Сообщество Overcoder
Наверх
Меню