J'ai une table item
, qui a une référence de clé étrangère à une table tax
. La colonne est tax_id
.MySQL: requête JOIN qui obtient tous les éléments avec un champ NULL
J'ai déjà eu l'tax_id
comme NOT NULL
dans mon schéma, mais je viens de changer cela parce que je veux que ce soit en option, alors maintenant il est NULL DEFAULT NULL
dans le schéma.
Cela a casse ma requête. Maintenant, quand je demande des articles et que je rejoins les taxes, je n'ai que celles où les champs tax_id
correspondent.
C'est ma requête:
SELECT item.*
FROM item
JOIN user_item
ON user_item.item_id = item.id
JOIN tax
ON tax.id = item.tax_id
WHERE user_item.user_id = ?
AND item.deleted_at IS NULL
AND user_item.deleted_at IS NULL
AND tax.deleted_at IS NULL
Cette requête fonctionne, si on me donne les éléments ci-dessous:
+----+--------+--------------------+-------------+-------+---------------------+------------+------------+
| id | tax_id | name | description | price | created_at | updated_at | deleted_at |
+----+--------+--------------------+-------------+-------+---------------------+------------+------------+
| 1 | 2 | foo | | 1.13 | 2017-07-30 15:20:14 | NULL | NULL |
| 2 | NULL | bar | | 0.67 | 2017-07-30 15:20:25 | NULL | NULL |
| 3 | NULL | baz | | 1.15 | 2017-07-30 15:22:33 | NULL | NULL |
+----+--------+--------------------+-------------+-------+---------------------+------------+------------+
Ensuite, la requête renvoie uniquement l'élément avec id 1. Je veux id 2 et 3 aussi.
Comment puis-je modifier ma requête pour y parvenir? Je comprends le problème de la requête est cette partie: ON tax.id = item.tax_id
.
Je vois .. Je ne l'ai pas utilisé avant jointure gauche. J'ai essayé de le modifier, mais j'ai reçu cette erreur: 'sql: Erreur d'analyse sur l'index de colonne 1: convertissant driver.Value tapez (" ") en un int: syntaxe invalide'. Je pense que c'est parce que j'essaie de comparer «NULL» à «INT»? –
Lansana
Yup - cela vient probablement du code le ** appelle ** cette requête et tente de convertir une des colonnes dans le résultat en un 'int' (quand la valeur retournée réelle) est un' null' – Mureinik
Ah je vois, oui vous avez raison, c'est un bug de programmation et je devrais utiliser le type 'NullInt64' où j'utilise' int', selon certaines recherches que j'ai faites. Mais la requête elle-même fonctionne correctement. Merci pour la perspicacité! – Lansana