+----+-----------+-----------+-------------+----------+
| 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 |
+----+-----------+-----------+-------------+----------+
上記の表にデータがあります。以下のクエリを使用して、テーブルからデータを取得します。
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)
ここでは、内部結合を使用してvalue_id
をparent_id
から取得しています。
基本的に、現在のレコードに使用できる親があるかどうかを確認し、存在する場合はそのデータを取得します。レコードの親の数がINNER JOIN
の数と同じ場合、正しいデータを取得できます
上記のクエリと同様に、私は次のような詳細を取得します
+-------+-------+-------+-----------+
| name0 | name1 | name2 | name3 |
+-------+-------+-------+-----------+
| ttt | 4000 | 2 | comprable |
| rrr | 5000 | 3 | comprable |
+-------+-------+-------+-----------+
ここで私はテーブルの下に行きたいです
+-------+-------+-------+-----------+
| name0 | name1 | name2 | name3 |
+-------+-------+-------+-----------+
| ttt | 4000 | 2 | comprable |
| rrr | 5000 | 3 | comprable |
| bbb | 4000 | NULL | NULL |
+-------+-------+-------+-----------+
ここの最後の行には、d2
テーブルとd3
テーブルがありません。そのデータもNULL
の値に含めたいです。
どんな助けでもありがたいです。
内部結合を左結合に置き換えると、必要なデータが得られます。左側の結合は、反対側に一致がない場合でも結果を示し、その場合はnullを示します。
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)
左結合を使用する理由は次のとおりです。
結合の基本
Inner Joinは、左と右の両方のテーブルから一致する行のみを提供します。
左結合は、左のテーブルのすべてのレコードと右のテーブルの一致するレコードを返します。つまり、右側のテーブルに一致するものがない場合、右側のテーブル列の代わりにNULLが表示されます。
右結合は、左テーブルと右テーブルで同じですが、逆の動作をします。
次に、完全外部結合と相互結合がありますが、質問に適用されないため、それらを調べることができます。