MySQL вывести строки по условиям запроса IF/ELSE CASE

172
26 марта 2019, 15:10

Допустим есть такая таблица __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'?

Answer 1
SELECT *
FROM table
WHERE id = @id
ORDER BY lang = @lang DESC
LIMIT 1
Answer 2

Пока пришел к такому результату.

Есть таблица документов с разными переводами.

Зашел итальянец и запросил документы(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)

Надеемся что приоритет его знаний:

  1. итальянский (ну это и понятно)
  2. английский
  3. французский
  4. ну и на "крайняк" пусть учит русский

Возможно кто-то напишет и покороче.

PS Обновление.

Спасибо за подсказку 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-ом, но если никак, то ...

READ ALSO
Формулировка запроса SQL

Формулировка запроса SQL

Есть две таблицы в одной БД group и student, задача стоит вытащить группы в которых нет студентов, в таблице student есть столбец groupID который обозначает...

210
Mysql: как выбрать рандомную запись? [дубликат]

Mysql: как выбрать рандомную запись? [дубликат]

На данный вопрос уже ответили:

141