繁体   English   中英

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

暂无
暂无

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

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM