MySQL 的 2 个字段上的 SQL LEFT-JOIN

Posted

技术标签:

【中文标题】MySQL 的 2 个字段上的 SQL LEFT-JOIN【英文标题】:SQL LEFT-JOIN on 2 fields for MySQL 【发布时间】:2013-09-25 17:16:08 【问题描述】:

我有一个视图A 和一个视图B

A 中,我有很多关于某些系统的信息,例如IPport,我想保留所有这些信息。在B 中,我只想在A 添加一条信息。

两个视图之间的匹配字段是IPPort。所以我必须在两个视图中匹配那些具有相同 IP 和端口的主机。

例子:

查看 A:

IP | OS     | Hostname | Port | Protocol
1  | Win    | hostONE  | 80   | tcp 
1  | Win    | hostONE  | 443  | tcp 
1  | Win    | hostONE  | 8080 | tcp 
2  | Linux  | hostTWO  | 21   | tcp
2  | Linux  | hostTWO  | 80   | tcp
3  | Linux  | hostTR   | 22   | tcp

视图 B:

IP | Port | State
1  | 443  | Open
2  | 80   | Closed

输出

IP | OS     | Hostname | Port | Protocol | State
1  | Win    | hostONE  | 80   | tcp      |
1  | Win    | hostONE  | 443  | tcp      | Open
1  | Win    | hostONE  | 8080 | tcp      |
2  | Linux  | hostTWO  | 21   | tcp      | Closed
2  | Linux  | hostTWO  | 80   | tcp      |
3  | Linux  | hostTR   | 22   | tcp      |

注意:视图A的某些主机可能在视图B中没有IP/Port相关项。

也可能是视图A的某些主机在视图B中有一些匹配。

我认为我应该使用 LEFT JOIN 以获得视图 A 的所有条目和视图 B 的正确关联条目,但它不起作用。 我无法使用正确的 WHERE 子句和 JOIN 解决方案调整查询。

有什么想法吗?

【问题讨论】:

你尝试了什么?向我们展示您的代码示例 您的WHERE 子句包含什么? 【参考方案1】:
select a.ip, a.os, a.hostname, a.port, a.protocol,
       b.state
from a
left join b on a.ip = b.ip 
           and a.port = b.port

【讨论】:

谢谢!我缺少的是 ON 子句中的双 =!【参考方案2】:

让我们试试这个方法:

select 
    a.ip, 
    a.os, 
    a.hostname, 
    a.port, 
    a.protocol, 
    b.state
from a
left join b 
    on a.ip = b.ip 
        and a.port = b.port /*if you has to filter by columns from right table , then add this condition in ON clause*/
where a.somecolumn = somevalue /*if you have to filter by some column from left table, then add it to where condition*/

因此,在where 子句中,您只能通过这种方式从右表中按列过滤结果集:

...
where b.somecolumn <> (=) null

【讨论】:

感谢您的回答以及关于 WHERE 子句的详细信息。

以上是关于MySQL 的 2 个字段上的 SQL LEFT-JOIN的主要内容,如果未能解决你的问题,请参考以下文章

我厚吗? MySQL:LEFT JOIN 上的“不是唯一的表/别名”

mysql之聚合函数

PHP MYSQL 复制字段并修改名称写入到另个字段

Sql关于两个left join 的问题

mysql中left join和union有啥区别?

SQL优化:慎用标量子查询,改用left join提升查询效率