Допустим есть такая таблица __test_if_else.
Необходимо вывести строки соответствующие двум условиям.
На "псевдо языке" это выглядело бы примерно вот так:
// Если есть id проверяем поле lang и выводим строку начиная с первого условия
// т.е. вывести строки с двумя идентификаторами, но если нет 'en' вместо нее вывести 'ru'
if( id (1||2) in table ) {
if ( lang === 'en' in table ) {
return this.ROW_EN // если сошлось
}
else if ( lang === 'ru' in table ){
return this.ROW_RU // ... нет 'en' выводим 'ru'
}
else {
return NULL
}
}
Пробовал CASE, но не обнаружил у него подобие BREAK,
и еще он выводит все строки с дополнительным полем после THEN.
Неудавшиеся примеры:
Здесь необходимо выбрать строку с lang = 'en',
так как она первая в условии.
SELECT *,
CASE
WHEN (lang = 'en' and id_not_unique = 1) THEN 1
WHEN (lang = 'ru' and id_not_unique = 1) THEN 1
END AS `row`
from __test_if_else;
А здесь выбрать lang = 'ru', так как 'en' с id_not_unique=2 отсутствует.
SELECT *,
CASE
WHEN (lang = 'en' and id_not_unique = 2) THEN 1
WHEN (lang = 'ru' and id_not_unique = 2) THEN 1
END AS `row`
from __test_if_else;
В примерах указал только один идентификатор, на деле их множество.
id_not_unique IN (1,2 .... 1253)
Как вывести только необходимые поля таблицы, с определенными идентификаторами,
но при отсутствии строки 'en'(которая проверяется первой) вывести строки с 'ru'?
SELECT *
FROM table
WHERE id = @id
ORDER BY lang = @lang DESC
LIMIT 1
Есть таблица документов с разными переводами.
Зашел итальянец и запросил документы(1-4) на своем языке, но вероятно всех переводов нет. Пытаемся возвратить в порядке приоритета.
SELECT N.id_not_unique, N.lang, N.document FROM __test_if_else AS N
INNER JOIN
(SELECT S.id_not_unique, S.lang FROM
(SELECT id_not_unique, lang,
CASE lang
WHEN 'it' THEN 0
WHEN 'en' THEN 1
WHEN 'fr' THEN 2
ELSE 3
END AS success
from __test_if_else WHERE id_not_unique IN (1,2,3,4) AND lang IN ( 'ru','en','it','fr' )
ORDER BY success ) AS S
GROUP BY S.id_not_unique) AS U
ON (U.id_not_unique = N.id_not_unique AND U.lang = N.lang)
Надеемся что приоритет его знаний:
Возможно кто-то напишет и покороче.
Спасибо за подсказку Mike
Ведь действительно CASE-ом я просто сортировал поле "lang", которое можно отсортировать и так.
В общем уменьшилось до этого, и решил добавить необязательное поле "id", чтоб INNER JOIN сравнивал только одну переменную - ведь быстрее будет.
[id][id_not_unique][lang][document]
SELECT N.id_not_unique, N.lang, N.document FROM __test_if_else AS N
INNER JOIN
(SELECT S.id FROM
(SELECT id, id_not_unique
from __test_if_else WHERE id_not_unique IN (1,2,3,4,5/*8576*/) AND lang IN ( 'ru','en','it','fr' )
ORDER BY field (lang, 'fr', 'en', 'it' ) DESC ) AS S
GROUP BY S.id_not_unique) AS U
ON N.id = U.id
Хотелось бы, конечно, одним SELECT-ом, но если никак, то ...
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Перевод документов на английский язык: Важность и ключевые аспекты
Есть две таблицы в одной БД group и student, задача стоит вытащить группы в которых нет студентов, в таблице student есть столбец groupID который обозначает...