Setor
Новичок
Выборка только одного или другого значения из связной таблицы
Задача заключается в следующем: есть мультиязычный каталог (табл. catalog), каждому элементу каталога соответствует хотябы одно название на одном из имеющихся языков (табл. catalog_lang). Обязательно существует название на английском и может существовать название на текущем языке. Требуется 1м запросом с объединением этих таблиц выбрать группу каталогов с названиями в приоритете на текущем языке, или если таковых не будет - на английском.
Таблица catalog:
categories_id | section_id
1 | 1
2 | 1
3 | 2
Таблица catalog_lang:
id | categories_id | languages_id | categories_name
1 | 1 | 0 | Computers
2 | 1 | 1 | Компьютеры
3 | 2 | 0 | Monitors
После выборки с условием section_id = 1 и ( languages_id = 1 или languages_id = 0 ) должно получиться:
section_id | categories_id | languages_id | categories_name
1 | 1 | 1 | Компьютеры
1 | 2 | 0 | Monitors
Обычный OR в таком случае будет выбирать всё подряд, а последующая группировка GROUP BY не поддаётся контролю и оставить из сгруппированного множества запись приоритетно на выбранном языке не представляется мне возможным. Только если предварительно отсортировать результат выборки по categories_id и languages_id во временную таблицу и с ней уже делать группировку, тогда гипотетически после группировки будет оставлен первый (верхний) элемент из группируемого множества. (например, двойным селектом в одном запросе) MySQL >= 4.1
Я думаю, это одна из классических задач, которая должна была вставать на пути многих. Я видел пример её решения в одной из книг, но он довольно громоздкий.
Может есть ещё какие-то варианты?
Задача заключается в следующем: есть мультиязычный каталог (табл. catalog), каждому элементу каталога соответствует хотябы одно название на одном из имеющихся языков (табл. catalog_lang). Обязательно существует название на английском и может существовать название на текущем языке. Требуется 1м запросом с объединением этих таблиц выбрать группу каталогов с названиями в приоритете на текущем языке, или если таковых не будет - на английском.
Таблица catalog:
categories_id | section_id
1 | 1
2 | 1
3 | 2
Таблица catalog_lang:
id | categories_id | languages_id | categories_name
1 | 1 | 0 | Computers
2 | 1 | 1 | Компьютеры
3 | 2 | 0 | Monitors
После выборки с условием section_id = 1 и ( languages_id = 1 или languages_id = 0 ) должно получиться:
section_id | categories_id | languages_id | categories_name
1 | 1 | 1 | Компьютеры
1 | 2 | 0 | Monitors
Обычный OR в таком случае будет выбирать всё подряд, а последующая группировка GROUP BY не поддаётся контролю и оставить из сгруппированного множества запись приоритетно на выбранном языке не представляется мне возможным. Только если предварительно отсортировать результат выборки по categories_id и languages_id во временную таблицу и с ней уже делать группировку, тогда гипотетически после группировки будет оставлен первый (верхний) элемент из группируемого множества. (например, двойным селектом в одном запросе) MySQL >= 4.1
Я думаю, это одна из классических задач, которая должна была вставать на пути многих. Я видел пример её решения в одной из книг, но он довольно громоздкий.
Может есть ещё какие-то варианты?