2017-03-28 3 views
2

Je suis en train de construire une petite application de conjugaison/radicalisation, et j'ai trébuché sur un problème. J'ai cette requête SQL:SQL WHERE IN avec Left Join ne retourne pas toutes les lignes que j'attends

SELECT DISTINCT RA.* 
FROM  radical RA 
left join conjugated CO 
on  CO.word_id = RA.id 
where  CO.conjugation IN ('I', 'am', 'a', 'cat') 

qui retourne:

| id | radical | 
| 13 | to be | 

Cependant, je voudrais obtenir un résultat du type:

| id | radical | word | 
| null | null | I | 
| 13 | to be | am | 
| null | null | a | 
| null | null | cat | 

Est-ce que quelqu'un sait comment?

+0

S'il vous plaît envoyer vos données d'échantillon –

Répondre

0

Apparemment vous utilisez un Left d'inscription, lorsque vous avez réellement besoin d'un Right rejoindre (car il semble que vous voulez que toutes les lignes de la table de droite correspondant à l'attribut à retourner)

Alors, mettez l'appareil la jointure:

SELECT DISTINCT RA.*, co.`conjugated` as word 
FROM  radical RA 
right join conjugated CO 
on  CO.word_id = RA.id 
where  CO.conjugation IN ('I', 'am', 'a', 'cat'); 

Ou changer l'ordre des tables dans la:

SELECT DISTINCT RA.*, co.`conjugated` as word 
FROM  conjugated CO 
left join radical RA 
on  CO.word_id = RA.id 
where  CO.conjugation IN ('I', 'am', 'a', 'cat'); 
+1

Monsieur, je viens de sauver ma journée –

1

Vous avez besoin d'un left join, mais pour commencer avec tous les mots que vous souhaitez conserver:

select w.word, ra.* 
from (select 'I' as word union all 
     select 'am' union all select 'a' union all select 'cat' 
    ) w left join 
    conjugated co 
    on co.conjugation = w.word left join 
    radical ra 
    on ra.id = co.word_id; 

Si ces valeurs sont en conjugation, vous pouvez simplement faire:

select c.onjugation, ra.* 
from conjugated co left join 
    radical ra 
    on ra.id = co.word_id 
where c.conjugation in ('I', 'am', 'a', 'cat') ; 

C'est, conjugation devrait être le premier, parce que vous voulez garder toutes les lignes correspondantes dans cette table.