solotony
@solotony
покоряю пик Балмера

Как сделать выборку «по одному из каждой группы»?

Есть таблица "страниц", у каждой страницы есть атрибут "язык" и "slug". Уникальный ключ - "slug"+"язык".

Надо выбрать все страницы, причем отдать приоритет страницам с заданным "языком", если ее нет - то с дефолтным "языком"

пример:

страница1 ru
страница2 ru
страница3 ru
страница1 en
страница2 en
страница3 en
страница1 ch
страница4 ch

дефолтный язык en

результат выборки для ru:
страница1 ru
страница2 ru
страница3 ru

результат выборки для ch:
страница1 ch
страница2 en
страница3 en
страница4 ch
  • Вопрос задан
  • 125 просмотров
Решения вопроса 1
@mletov
SELECT t1.slug, COALESCE(t2.lang, t3.lang, 'language not found') AS lang
FROM 
(
	SELECT DISTINCT slug
	FROM tbl 
) AS t1

LEFT JOIN tbl AS t2
ON t1.slug=t2.slug
AND t2.lang = 'ru'

LEFT JOIN tbl AS t3
ON t1.slug=t3.slug
AND t3.lang = 'en'
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
kawabanga
@kawabanga
Поиграйтесь с ORDER BY FIELD ('')

select * from pages ORDER BY FIELD (lang,'uk','ru');
Помню там сложность была, то что отсортированное поле уходит в конец.
Поэтому есть смысл готовить строку 'uk','ru' заранее, подставляя деофлтный язык в конце.

https://dba.stackexchange.com/questions/109120/how...
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы