Выборка мультиязычных данных из БД

Setor

Новичок
Выборка мультиязычных данных из БД

Доброго времени суток,

Столкнулся со следующей проблемой: нужно выбрать из таблицы мультиязычные данные для определённого языка (упрощённая структура БД):
Код:
id | gid | lang | name
1    1     ru     Компьютер
2    1     en     Computer
3    2     en     Monitor
Загвоздка заключается в том, что нужно выбрать все записи по ID на русском, а для тех, кому не задан русский вариант, вытягивать английский. Т.е. на выходе должно получиться такое:
Код:
id | gid | lang | name
1    1     ru     Компьютер
3    2     en     Monitor
Но не могу придумать как это красиво сделать (в плане логики и производительности). Используется в достаточно нагруженном проекте. В таблице несколько тысяч записей (выбирается из всей кучи обычно не более 100 записей). До этого использовал такой метод: выбирал все русские и английские записи, потом делал сортировку по полю lang (в реале используется цифровые идентификаторы языка, у английского языка ID 0, у русского ID 1 + есть другие языки), потом делал группировку по полю gid, тем самым обрезался лишний вариант перевода, но это какой-то костыль, может есть решение попроще? В документации по MySQL вообще сказано, что поведение ф-ции Group By в таких случаях вообще неопределено, но на деле она оставляет первую запись, остальные откидывает.
 

Gas

может по одной?
Подзапросом можно попробовать, примерно так:
select if (name is null, (select name ... where lang='en'...), name) as name from ... left join ... where lang='ru' ...
 

Setor

Новичок
Gas
Тоже была такая идея, проверять через NULL. Походу других вариантов больше нет...
 

zerkms

TDD infected
Команда форума
[sql]
SELECT * FROM `q` INNER JOIN
(
SELECT MAX(CASE `lang` WHEN 'ru' THEN 2 WHEN 'en' THEN 1 ELSE 0 END) AS `lang_id`, `gid`
FROM `q` `inner` GROUP BY `gid`
) `x` ON `x`.`gid` = `q`.`gid` AND (CASE `lang` WHEN 'ru' THEN 2 WHEN 'en' THEN 1 ELSE 0 END) = `x`.`lang_id`
[/sql]

:)
 

zerkms

TDD infected
Команда форума
WP
да запрос то простой ;)
это раскрасчик его растянул на полстраницы ;)
 
Сверху