LEFT JOIN不显示左侧表格的所有行

Hyd*_*erA 3 mysql join

考虑这个查询:

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
Run Code Online (Sandbox Code Playgroud)

我的印象是LEFT JOIN左表上显示所有行,无论条件是否匹配ON.

SELECT s.* FROM servers s
Run Code Online (Sandbox Code Playgroud)

返回12个条目,而第一个查询仅返回ip地址匹配的1.

那么如何让第一个查询显示服务器表中的所有行以及连接的表数据?

Joh*_*ica 7

聚合函数count()将所有行折叠为一个.
执行a 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
Run Code Online (Sandbox Code Playgroud)

如果servers.ip_address是服务器的唯一字段(主键或唯一索引),这将最有效.
如果服务器具有重复的ip_addresses,则此查询将这些ip_addresses组合在一起并隐藏应隐藏的数据.

然而,鉴于这些是服务器,假设ip_address是唯一的是合乎逻辑的.