Mysql comment rejoindre la même table, y compris les lignes manquantes
Question
J'ai une table avec du texte dans diverses langues. C'est défini comme ceci:
Id|Language|Text
EXAMPLE DATA
0, ENU, a
0, DAN, b
1, ENU, c
2, ENU, d
2, DAN, e
3, ESP, f
3, ENU, g
La langue et l'identification forment la clé.
Maintenant, je veux extraire tous les textes dans un langauge (disons l'anglais) et avoir le texte de coorospond dans une autre langue (disons danois) montré dans la colonne à côté. Le résultat devrait donc être:
0, a, b
1, c,
2, d, e
3, g
Je sais que je peux faire une jointure comme ceci:
SELECT t1.Id, t1.Text AS "ENU", t2.Text AS "DAN" table as t1
JOIN table as t2 ON (t1.Id= t2.Id)
WHERE t1.Langauge = "ENU" AND t2.Language = "DAN";
Mais cela n'inclut pas les lignes manquantes (c'est-à-dire ID de ligne = 1 et id = 3). Comment faire cela?
* METTRE À JOUR ****J'ai une suggestion d'utiliser la jointure de gauche mais je ne peux pas le faire fonctionner. Peut-être parce que ma disposition de table est un peu différente de celle de la question simplifiée ci-dessus. Ma table est définie comme ceci:
Langue | MPageId | MfieldId | Mparagraph | MText
Où la langue, le mpageid, le mfieldid, le mparagraph forme la clé
J'ai essayé ceci:
Sélectionnez t1.mpageid, t1.mfieldid, t1.mpparAPHID, t1.mtext, t2.mtext de main comme t1 gauche joing main as t2 on (t1.mpageid = t2.mpageid et t1.mfield = t2 = t2.mpparagraphid) où t1.mlanguage = 'enU' et t2.manguage = 'Dan'
La solution
SELECT t1.Id, t1.Text AS "ENU", t2.Text AS "DAN" FROM table as t1
LEFT JOIN table as t2 ON (t1.Id= t2.Id AND t2.Language = "DAN")
WHERE t1.Langauge = "ENU"
Autres conseils
Vous avez besoin de la jointure de gauche ... mais la "et" clause pour "Dan" ish serait appliquée à la jointure de gauche, et non dans la clause Where ... la clause Where implique une jointure intérieure
SELECT
t1.Id,
t1.Text AS "ENU",
t2.Text AS "DAN"
from
YourTable t1
LEFT JOIN YourTable t2
ON t1.Id= t2.Id
AND t2.Language = "DAN"
where
t1.Langauge = "ENU"
Vous voulez une jointure à gauche: http://www.tizag.com/mysqltutorial/mysqlleftjoin.php
select Id,
MAX(case when LanguageS='ENU' then Text else null end ) as A,
MAX( case when LanguageS<>'ENU' then Text else null end ) as B
from LAN
GROUP BY 1
Id A B
0 a b
1 c ?
2 d e
3 g f