[英]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
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.