#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 уникален.