考虑这个查询:
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.
那么如何让第一个查询显示服务器表中的所有行以及连接的表数据?
聚合函数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是唯一的是合乎逻辑的.