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