distinct, сортировка

zerkms

TDD infected
Команда форума
distinct, сортировка

привет народ

есть таблица tbl c полями:
id field1 field2 field3 ...
1 | 2 | 3 | 4 | 5
1 | 1 | 3 | 5 | 6
1 | 3 | 1 | 5 | 7
2 | 1 | ...

как выбрать записи с уникальным ид, при том, чтобы выбранные записи содержали field1, отсортированный примерно по такому правилу:
сначала field1 = 3, затем field1 = 1, далее - все остальные
 

alpine

Новичок
zerkms
Через временную таблицу, но imho че-то у тебя со структурой таблицы не правильно
 

yugene

Отошел от дел
Автор оригинала: alpine
zerkms
че-то у тебя со структурой таблицы не правильно
Я тоже так думаю.

Если очень надо, добавь в запрос еще одну колонку, значение которой будет 0, если field1 = 3, 1 - если field1 = 1, 2 - если все остальное. Сортируй по ней.
 

zerkms

TDD infected
Команда форума
со структурой у меня вроде всё ок.
а смысл таблицы и выборки вообще таков:

пускай в ней хранятся статьи, у каждой из которой свой id (одинаковый для каждой языковой версии)

у статьи может быть несколько языковых версий - для каждой определён idlang (который характеризует язык написания статьи)

смысл таков - вывести список статей...
если имеется статья с idlang = текущий язык, то выводить именно её; если нет, то вывести с idlang = дефолтный язык сайта; если нет и такового, то вывести хоть с каким нибудь языком...

надеюсь обьяснил понятно ;)
 

Sluggard

Новичок
ORDER BY field1=3 DESC, field1=1 DESC

А id итак должно быть уникальным!!!!!!!!!!!!!!!!!!!!!!!!!
 

SelenIT

IT-лунатик :)
На мой взгляд, что-то вроде
ORDER BY CASE
WHEN field1 = 3 THEN 1
WHEN field1 = 1 THEN 2
ELSE 3
END
 

zerkms

TDD infected
Команда форума
а решение оказалось примерно таким:

SELECT * FROM tbl, (SELECT id, MIN(CASE field1 WHEN '3' THEN 1 WHEN '1' THEN 2 ELSE 3 END) as min_val from tbl GROUP BY id) x WHERE tbl.id=x.id AND (CASE tbl.field1 WHEN '3' THEN 1 WHEN '1' THEN 2 ELSE 3 END) = x.min_val
 

zerkms

TDD infected
Команда форума
yugene: вообще то это не проще и не понятнее - это правильнее и то, о чём я собственно спрашивал
 
Сверху