СОЕДИНЕНИЕ по ЛЕВОМУ КРАЮ не отображает все строки для таблицы слева

#mysql #join

#mysql #Присоединиться

Вопрос:

Рассмотрим этот запрос:

 SELECT s.*, COUNT( ssh_logs.id ) AS ssh_count FROM servers s 
LEFT JOIN logs ssh_logs ON s.ip_address = ssh_logs.server_ip
  

У меня такое впечатление, что LEFT JOIN показывает все строки в левой таблице, независимо от того, соответствует ли ON условие.

 SELECT s.* FROM servers s
  

Возвращает 12 записей, в то время как первый запрос возвращает только 1, где IP-адреса совпадают.

Итак, как мне получить первый запрос для отображения всех строк в таблице servers вместе с данными объединенной таблицы?

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

1. я думаю, что если вы удалите COUNT ( ssh_logs.id ) вы получите все строки.

2. @Sabeen, да, но это сведет на нет цель запроса.

3. @Johan да, но для сравнения не должно быть видно, что 2 запроса возвращают одинаковое количество строк. Просто пытаюсь указать OP на отладку путем исключения.

4. @Sabeen, если servers.ip_address является уникальным полем, запрос с group by servers.ip_address вернет 12 строк.

Ответ №1:

Агрегатная функция count() сворачивает все строки в одну.
Выполните group by , чтобы увидеть количество для каждого ip-адреса.

 SELECT s.*, COUNT(ssh_logs.id) AS ssh_count FROM servers s  
LEFT JOIN logs ssh_logs ON s.ip_address = ssh_logs.server_ip 
GROUP BY s.ip_address
  

Это будет работать лучше всего, если servers.ip_address является уникальным полем для серверов (первичный ключ или уникальный индекс).
Если серверы имеют повторяющиеся ip_addresses, то этот запрос сгруппирует эти ip_addresses вместе и скроет данные, которые должны быть скрыты.

Однако, учитывая тот факт, что это серверы, логично предположить, что ip_address уникален.