подсчитайте, чтобы вернуть 0, если записей не найдено

#mysql

Вопрос:

У меня есть набор таблиц, в которых хранится ежедневная информация о регистрациях. Теперь мне нужен запрос в MySQL, содержащий общее количество записей по текущей дате. Я сделал запрос, который работает нормально, но я ожидал 0 (ноль) на компьютерах, которые не зарегистрировали никаких записей. Здесь он не возвращает 0.

Я попробовал IFNULL () и COALESCE (), но все равно получаю тот же результат. Пожалуйста, помогите с этим запросом. Спасибо…….

 SELECT e.Equipo, COUNT(ec.ID_Equipo_Detalle) as captura  
FROM equipos as e 
LEFT JOIN equipos_detalle as eq
 ON e.ID_Equipo = eq.ID_Equipo
LEFT JOIN elecciones_contactos as ec
 on ec.ID_Equipo_Detalle = eq.ID_Equipos_Detalle
WHERE ec.FechaAlta BETWEEN CURRENT_DATE and CURRENT_DATE   1
GROUP by ec.ID_Equipo_Detalle
 
ID_Equipos Equipos
1 Zona 1
2 Zona 2
3 Zona 3
4 Zona 4
5 Zona 5
6 Zona 6
7 Zona 7
8 Zona 8
ID_Equipos_Detalle ID_Equipos id_ответчик
1 1 152
2 2 158
3 3 156
4 4 156
5 5 176
6 6 178
7 7 167
8 8 172
ID_Contactos ID_Equipos_Detalle Contacto Fecha_Alta
1 1 Хорхе 2021-04-26 12:20:27
2 2 Педро 2021-04-26 11:30:25
3 3 Фернандо 2021-04-26 11:20:23
4 4 Фелипе 2021-04-26 10:22:27
5 5 Луис 2021-04-25 10:22:27
6 6 Алексис 2021-04-25 10:12:30
7 7 Победитель 2021-04-24 09:22:28
8 8 Сезар 2021-04-24 09:15:27

Получен Результат:

Equipos captura
Zona 1 1
Zona 2 2
Zona 5 1

Ожидаемый результат (где дата 2021 — 04 — 26):

Equipos captura
Zona 1 1
Zona 2 2
Zona 3 0
Zona 4 0
Zona 5 1
Zona 6 0
Zona 7 0
Zona 8 0

Комментарии:

1. Вы повторно заявляете e … > > FROM equipos as e LEFT JOIN equipos_detalle as e Это намеренно?

2. Нет @Zak, я уже исправил

3. Вы пробовали группироваться с помощью ec.ID_Equipo_Detalle и ec. Фехаалта и то, и другое?

4. да, я пытался @RohitMittal

Ответ №1:

Вы отфильтровываете строки, в которых нет записей на заданную дату. Просто переместите фильтрацию в ЛЕВУЮ часть СОЕДИНЕНИЯ.

Так что вместо

 LEFT JOIN elecciones_contactos as ec
 on ec.ID_Equipo_Detalle = eq.ID_Equipos_Detalle
WHERE ec.FechaAlta BETWEEN CURRENT_DATE and CURRENT_DATE   1
GROUP by ec.ID_Equipo_Detalle
 

сделай это

 LEFT JOIN elecciones_contactos as ec
 on ec.ID_Equipo_Detalle = eq.ID_Equipos_Detalle
   and ec.FechaAlta BETWEEN CURRENT_DATE and CURRENT_DATE   1
GROUP by e.ID_Equipos
 

Также обратите внимание, что я переместил группу с ec.ID_Equipo_Detalle на e.ID_Equipos

Вот db-скрипка для демонстрации.

Ответ №2:

Ваше ГДЕ отбрасывает строки, вам нужно использовать подзапрос:

 SELECT e.Equipo, COUNT(ec.ID_Equipo_Detalle) AS captura  
FROM equipos AS e 
LEFT JOIN equipos_detalle AS eq ON e.ID_Equipo = eq.ID_Equipo
LEFT JOIN (SELECT * FROM elecciones_contactos WHERE FechaAlta BETWEEN CURRENT_DATE and CURRENT_DATE   INTERVAL 1 DAY) AS ec ON ec.ID_Equipo_Detalle = eq.ID_Equipos_Detalle
GROUP by ec.ID_Equipo_Detalle
 

Некоторые имена столбцов в вашем запросе не совпадают с ними в ваших таблицах (ID_Equipo в вашем запросе-это ID_Equipos в вашей таблице).