带有 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
我在构建 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