web-dev-qa-db-fra.com

Appliquer INNER JOIN uniquement s'il y a une ligne disponible, sinon utiliser NULL

+----+-----------+-----------+-------------+----------+
| 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       |
+----+-----------+-----------+-------------+----------+

J'ai ci-dessus le tableau avec des données. J'utilise une requête ci-dessous pour obtenir des données de la table.

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)

Ici, j'utilise la jointure interne pour obtenir value_id de son parent_id.

Fondamentalement, il vérifiera si un parent est disponible pour l'enregistrement en cours et obtiendra ses données le cas échéant. Je peux obtenir des données correctes si j'ai autant de parents pour un enregistrement que le nombre de INNER JOIN

Comme avec la requête ci-dessus, j'obtiens des détails comme

+-------+-------+-------+-----------+
| name0 | name1 | name2 |   name3   |
+-------+-------+-------+-----------+
| ttt   |  4000 |     2 | comprable |
| rrr   |  5000 |     3 | comprable |
+-------+-------+-------+-----------+

Ici, je veux aller sous le tableau

+-------+-------+-------+-----------+
| name0 | name1 | name2 |   name3   |
+-------+-------+-------+-----------+
| ttt   |  4000 |     2 | comprable |
| rrr   |  5000 |     3 | comprable |
| bbb   |  4000 |  NULL | NULL      |
+-------+-------+-------+-----------+

Ici, au dernier rang, je n'ai pas d2 et d3 tables disponibles. Je veux également inclure ces données avec la valeur NULL.

Toute aide est appréciée.

2
Jaimin Sutariya

Si vous remplacez les jointures internes par des jointures gauches, vous obtiendrez les données souhaitées. La jointure de gauche montre les résultats même s'il n'y a pas de correspondance de l'autre côté et dans ces cas, affiche une valeur nulle.

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)
9
Joe W

Utilisez Left Joins, voici pourquoi:

Les bases des jointures

Un Inner Join ne vous donnera que des lignes qui correspondent à la fois du tableau de gauche et de droite.

A Left Join renverra tous les enregistrements de la table de gauche et les enregistrements correspondants de la table de droite. Cela signifie que là où il n'y a pas de correspondance de la bonne table, des valeurs NULL apparaîtront à la place des colonnes de la bonne table.

A Right Join agit de la même façon mais inversement pour les tableaux gauche et droit.

Ensuite, il y a les jointures externes complètes et les jointures croisées, mais vous pouvez les rechercher car elles ne s'appliquent pas à votre question!

4
beastmaster283