仅当有可用行时才应用 INNER JOIN 否则使用 NULL

Jai*_*iya 6 mysql join

+----+-----------+-----------+-------------+----------+
| id | value_id  | parent_id | dropdown_id | name     |
+----+-----------+-----------+-------------+----------+
|  7 | 14945     |  14944    |         57  |4000      |
|  8 | 14944     |  0        |         56  |bbb       |
|  9 | 14943     |  14940    |         59  |comprable |
| 10 | 14942     |  14939    |         59  |comprable |
| 11 | 14940     |  14931    |         58  |3         |
| 12 | 14939     |  14930    |         58  |2         |
| 13 | 14931     |  14929    |         57  |5000      |
| 14 | 14930     |  14928    |         57  |4000      |
| 15 | 14929     |  0        |         56  |rrr       |
| 16 | 14928     |  0        |         56  |ttt       |
+----+-----------+-----------+-------------+----------+
Run Code Online (Sandbox Code Playgroud)

我有上面的数据表。我使用下面的查询从表中获取数据。

SELECT `d0`.`name` AS `name0`, `d1`.`name` AS `name1`, `d2`.`name` AS `name2`, `d3`.`name` AS `name3` FROM `my_table_1` AS `d0`
 INNER JOIN `my_table_1` AS `d1` ON d1.parent_id = d0.value_id
 INNER JOIN `my_table_1` AS `d2` ON d2.parent_id = d1.value_id
 INNER JOIN `my_table_1` AS `d3` ON d3.parent_id = d2.value_id
 WHERE (d0.dropdown_id=56)
Run Code Online (Sandbox Code Playgroud)

在这里,我使用内部连接value_id从它的parent_id.

基本上,它会检查当前记录是否有可用的父项,如果有的话,将获取其数据。如果我有与记录的父母数量一样多的父母,我可以获得正确的数据INNER JOIN

就像上面的查询一样,我得到了像

+-------+-------+-------+-----------+
| name0 | name1 | name2 |   name3   |
+-------+-------+-------+-----------+
| ttt   |  4000 |     2 | comprable |
| rrr   |  5000 |     3 | comprable |
+-------+-------+-------+-----------+
Run Code Online (Sandbox Code Playgroud)

在这里我想得到下表

+-------+-------+-------+-----------+
| name0 | name1 | name2 |   name3   |
+-------+-------+-------+-----------+
| ttt   |  4000 |     2 | comprable |
| rrr   |  5000 |     3 | comprable |
| bbb   |  4000 |  NULL | NULL      |
+-------+-------+-------+-----------+
Run Code Online (Sandbox Code Playgroud)

这里最后一排,我没有d2d3表可用。我也想包含这些数据的NULL价值。

任何帮助表示赞赏。

Joe*_*e W 14

如果您用左连接替换内连接,您将获得所需的数据。即使在另一侧没有匹配项,左连接也会显示结果,并且在这些情况下显示空值。

SELECT `d0`.`name` AS `name0`, `d1`.`name` AS `name1`, `d2`.`name` AS 
       `name2`, `d3`.`name` AS `name3` FROM `my_table_1` AS `d0`
 LEFT JOIN `my_table_1` AS `d1` ON d1.parent_id = d0.value_id
 LEFT JOIN `my_table_1` AS `d2` ON d2.parent_id = d1.value_id
 LEFT JOIN `my_table_1` AS `d3` ON d3.parent_id = d2.value_id
 WHERE (d0.dropdown_id=56)
Run Code Online (Sandbox Code Playgroud)


小智 7

使用左连接,原因如下:

联接的基础知识

一个内部加入只会给你行,从左边和右边的表都匹配。

一个左联接将返回左表和匹配的记录中的所有记录右表。这意味着如果右表中没有匹配项,NULL 将出现在右表列的位置。

一个右连接作用的左和右表相同,但相反的行为。

然后有完整的外部联接和交叉联接,但您可以查找它,因为它们不适用于您的问题!