带有 MySQL LEFT JOIN 的 WHERE 子句

WHERE clause with MySQL LEFT JOIN

我在构建 LEFT JOIN 查询以过滤掉特定数据时遇到问题。

表A

+-----------------+-------------+
| name (UNIQUE)   | description |
+-----------------+-------------+
| test_1          | desc_1      |
| test_2          | desc_2      |
| test_3          | desc_3      |
| test_4          | desc_4      |
+-----------------+-------------+

表B

+--------+-------+
| name   | data  |
+--------+-------+
| test_1 | val_1 |
| test_2 | val_1 |
| test_1 | val_2 |
| test_1 | val_3 |
+--------+-------+

使用以下查询我得到以下结果:

SELECT tableA.name, tableA.description tableB.data
FROM tableA 
LEFT JOIN tableB
ON tableB.name=tableA.name
WHERE tableB.data='val_1'

结果:

+--------+-------+-------------+
| name   | data  | description |
+--------+-------+-------------+
| test_1 | val_1 | desc_1      |
| test_2 | val_1 | desc_2      |
+--------+-------+-------------+

这是我要查找的结果:

+--------+-------+-------------+
| name   | data  | description |
+--------+-------+-------------+
| test_1 | val_1 | desc_1      |
| test_2 | val_1 | desc_2      |
| test_3 | NULL  | desc_1      |
| test_4 | NULL  | desc_2      |
+--------+-------+-------------+

是否可以构建一个像那样过滤的查询?

因为您在 WHERE 子句中对 TableB 进行了筛选,所以您从最终输出中删除了 TableB.data 列中具有 'val_1' 的所有行。如果您将条件作为 LEFT JOIN 的一部分,您将过滤来自 TableB 的记录,但仍会获得来自 TableA 的所有记录。

您的查询将如下所示:

SELECT tableA.name, tableA.description, tableB.data
FROM tableA 
LEFT JOIN tableB
ON tableB.name=tableA.name
AND tableB.data='val_1'

这将输出:

NAME DESCRIPTION DATA
test_1 desc_1 val_1 
test_2 desc_2 val_1 
test_3 desc_3 (null) 
test_4 desc_4 (null) 

您描述的输出,组合:

test_3 desc_1 (null)
test_4 desc_2 (null)

似乎不​​是此查询的合理输出,因为该数据在表中不可用,或者我遗漏了一些信息。

SELECT tableA.name, tableA.description, b.data
FROM tableA 
LEFT JOIN ( 
SELECT * FROM tableB
WHERE tableB.data='val_1' ) as b
ON b.name=tableA.name