MySQL LEFT JOIN的WHERE子句

时间:2015-02-19 03:45:35

标签: mysql sql join left-join where

我无法构建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      |
+--------+-------+-------------+

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

2 个答案:

答案 0 :(得分:4)

因为在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)

这个查询似乎不是一个合理的输出,因为表中没有这些数据,或者我缺少一些信息。

答案 1 :(得分:0)

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