MySQL: как удалить строки из набора? - PullRequest
1 голос
/ 22 января 2012

У меня есть запрос на перевод: (структура таблицы:

  1. line_id
  2. lang ("en" или "ru")
  3. текст

так, в таблице это выглядит так:

5 | en | Test
6 | en | Hello!
7 | en | Another words
6 | ru | Привет!

и все переводы находятся в одной таблице с ключом line_id, который не зависит от языка)

SELECT txt.line_id, txt.text AS o, ru.text AS t 
  FROM text AS txt, text AS ru 
 WHERE txt.line_id = ru.line_id 
   AND txt.lang = 'en';

вернет такой массив

> [5] => Array ( [line_id] => 5 [o] => Test [t] => Test 
> [6] => Array ( [line_id] => 6 [o] => Hello! [t] => Hello! ) 
> [7] => Array ( [line_id] => 6 [o] => Hello! [t] => Привет! )

o - оригинальный текст, t - перевод.

Как удалить из строки набора №6, потому что у нас есть перевод в следующей строке. GROUP BY убьет # 7 и сохранит # 6 строку.

лучший результат будет:

> [5] => Array ( [line_id] => 5 [o] => Test [t] => ) 
> [6] => Array ( [line_id] => 6 [o] => Hello! [t] => Привет! )

без [o] => Привет! [t] => Привет!

Ответы [ 4 ]

3 голосов
/ 22 января 2012

Я просто предполагаю, что вам, вероятно, нужно:

SELECT txt.line_id, 
         txt.text AS o, 
         COALESCE (ru.text,'UNTRANSLATED') AS t 
FROM 
  text AS txt
LEFT JOIN 
  text AS ru 
ON txt.line_id=ru.line_id AND ru.lang='ru'
WHERE txt.lang='en'
0 голосов
/ 22 января 2012

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

По моему мнению, вы могли бы разделить проблему: первый списокоригинальные строки без перевода одним нажатием кнопки SELECT;затем перечислите переводы с другим SELECT;в конце используйте UNION.

-- original without translations
SELECT txt.line_id, txt.text AS o, ru.text AS t 
FROM text AS txt LEFT JOIN text AS ru 
ON(txt.line_id = ru.line_id AND txt.lang = 'en' AND ru.lang != 'en')
WHERE ru.line_id IS NULL -- ensures no translations have been found

UNION

-- only matching translations
SELECT txt.line_id, txt.text AS o, ru.text AS t
FROM text AS txt JOIN text AS ru 
ON(txt.line_id = ru.line_id AND txt.lang = 'en' AND ru.lang != 'en');

С уважением.

0 голосов
/ 22 января 2012

Как насчет сортировки по lang desc (поэтому ru сверху), а затем группировка по line_id?

0 голосов
/ 22 января 2012

исключить язык оригинала из таблицы перевода

SELECT txt.line_id, txt.text AS o, ru.text AS t 
FROM text AS txt, text AS ru 
WHERE txt.line_id=ru.line_id 
   AND txt.lang='en' 
   AND ru.lang!='en'

новая версия для нового описания

SELECT txt.line_id, ru.lang, ru.text AS t 
FROM text AS txt, text AS ru 
WHERE txt.line_id=ru.line_id 
   AND txt.lang='en'
ORDER BY text.lang, txt.line_id
...