Операции внутри группы, когда GROUP BY - PullRequest
0 голосов
/ 28 ноября 2011

Ключ таблицы items состоит из ( lang , id ).Некоторые предметы имеют переведенные названия на разных языках.Я хочу создать такой запрос, который бы возвращал все элементы из БД на заданном языке, и если элемент не имеет перевода, чтобы вернуть непереведенное значение.

Скажем, я хочу, чтобы все предметы были написаны на болгарском языке.Вот где я застрял:

SELECT lang, id, name
FROM items
WHERE lang = "bg" OR lang = "en"
GROUP BY id

Проблема возникает, когда есть предмет, скажем, ( 1 , "en" ) и предмет( 1 , "bg" ).Идентификаторы одинаковы.Тогда как MySQL или SQLite определяют, какой результат вернуть?Могу ли я сказать, что я предпочел бы вернуть ( 1 , "bg" ), если он существует, но если его нет, ( 1 , "en" ) меня бы устроили?

PS Для дальнейшей иллюстрации того, что я хочу, давайте представим, что база данных содержит следующие записи со схемой (id,lang, name):

( 1 , "en" , "abc" )

(2 , "en" , "cde" )

( 3 , "en" , "def" )

( 1 , "bg" , "абв" )

( 3 , "bg" , "жзи" )

После выполнения требуемого запроса на болгарском языке я должен получить:

( 1 , "бг" , "абв" )

( 2 , "en" , "cde" )

( 3 , "bg" , "жзи" )

Ответы [ 3 ]

4 голосов
/ 28 ноября 2011

Если «непереведенный» означает «английский» или другими словами, базовый язык - английский, вы можете LEFT присоединить таблицу к себе и использовать функцию COALESCE(), чтобы избавиться от NULL значений

SELECT COALESCE(bg.lang, en.lang) AS lang
     , en.id                      AS id
     , COALESCE(bg.name, en.name) AS name
FROM items en
  LEFT JOIN items bg
    ON  bg.id = en.id
    AND bg.lang = 'bg'
WHERE en.lang = 'en'
1 голос
/ 28 ноября 2011

Стандартный SQL не позволяет выбирать столбцы в запросах «группа по», которые либо (1) не появляются в группе по списку, ни (2) не включаются в статистическую функцию. Любой промышленный механизм SQL (DB2, Oracle, SQL Server) посчитает ваш запрос неверным.

В случаях, когда вам нужно выбрать определенный элемент или значение по умолчанию, когда его нет в базе данных, используется функция coalesce . С этой функцией вы сможете сформулировать свой запрос без «group by».

0 голосов
/ 28 ноября 2011

Вы можете сделать GROUP BY для нескольких столбцов:

SELECT lang, id, name
FROM items
WHERE lang = "bg" OR lang = "en"
GROUP BY id, lang
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...