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

时间:2011-06-09 11:22:04

标签: 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

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

SELECT s.* FROM servers s

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

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

1 个答案:

答案 0 :(得分:7)

聚合函数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是唯一的,这是合乎逻辑的。