2017-03-28 1 views
2

Ich baue eine kleine Konjugations-/Radikalisierungs-App, und ich bin auf ein Problem gestoßen. Ich habe diese SQL-Anfrage:SQL WHERE IN mit Links Join gibt nicht alle Zeilen zurück, die ich erwarte

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

Das zurückgibt:

| id | radical | 
| 13 | to be | 

Aber ich möchte ein Ergebnis der Art erhalten:

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

Wer weiß, wie?

+0

Bitte posten Sie Ihre Beispieldaten –

Antwort

0

Scheinbar verwenden Sie ein Left Mitglied werden, wenn Sie tatsächlich ein Right müssen beitreten (da es scheint, dass Sie möchten, dass alle Zeilen der rechten Tabelle das Prädikat passende zurückgegeben werden)

entweder So wechseln die Join:

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'); 

Oder schalten Sie die Reihenfolge der Tabellen in der FROM:

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

Sie, mein Herr, haben gerade meinen Tag gerettet –

1

Sie benötigen ein left join, aber mit allen Wörter, die Sie behalten möchten, zu starten:

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; 

Wenn diese Werte sind in conjugation, können Sie einfach tun:

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') ; 

Das heißt, conjugation sollte der erste sein, weil Sie alle übereinstimmenden Zeilen in dieser Tabelle behalten möchten.

Verwandte Themen