LEFT JOIN не показывает все строки для таблицы слева - PullRequest
3 голосов
/ 09 июня 2011

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

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-адреса совпадают.

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

1 Ответ

7 голосов
/ 09 июня 2011

Агрегатная функция 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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...