MySQL, как присоединиться к той же таблице, включая пропущенные строки - PullRequest
2 голосов
/ 24 февраля 2012

У меня есть таблица с текстом на разных языках. Это определено так:

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

Язык и Id образуют ключ.

Теперь я хочу извлечь все тексты на одном языке (скажем, на английском) и получить соответствующий текст на другом языке (например, на датском), показанный в столбце рядом с. Таким образом, результат должен быть:

0, a, b
1, c, 
2, d, e
3, g

Я знаю, что могу сделать соединение следующим образом:

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";

Но это не включает пропущенные строки (т.е. id строки = 1 и id = 3). Как это сделать?

* ОБНОВЛЕНИЕ **** Я получаю предложение использовать LEFT JOIN, но не могу заставить его работать. Может быть, потому что мое расположение на столе немного отличается от упрощенного вопроса выше. Моя таблица определена так:

Язык | MPageId | MFieldId | MParagraph | многострочный текст

Где язык, MPageId, MFieldId, MParagraph образуют ключ

Я пробовал это:

SELECT t1.MPageId, t1.MFieldId, t1.MParagraphId, t1.MText, t2.MText ОТ основного как ЛЕВЫЙ ПРИСОЕДИНЯЙТЕСЬ Основной как t2 ВКЛ (t1.MPageId = t2.MPageId И t1.MFieldId = t2.MFieldId AND t1.MParagraphId = t2.MParagraphId) ГДЕ t1.MLanguage = 'ENU' И t2.MLanguage = 'DAN'

Ответы [ 4 ]

2 голосов
/ 24 февраля 2012
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"
1 голос
/ 24 февраля 2012

Вам нужно левое соединение ... но предложение "AND" для ish "DAN" будет применяться в левом соединении, а не в предложении WHERE ... Предложение where подразумевает INNER JOIN

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"
0 голосов
/ 19 мая 2015
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
0 голосов
/ 24 февраля 2012

Вы хотите присоединиться слева: http://www.tizag.com/mysqlTutorial/mysqlleftjoin.php

...