Привет! Ищу ответ, но пока не нашел... может быстрее мне помогу здесь... Есть таблица ТАБЛ в ней есть два поля СТАТУС (принимает значение от 0 до 3) и ДАТА Нужно сделать выборку вывести сначала все записи где СТАТУС =3 отсортированные по дате, а потом все остальные записи также отсортированные по дате... (SELECT * FROM `ТАБЛ` WHERE `СТАТУС` =3 ORDER BY `ТАБЛ`.`ДАТА` DESC) UNION (SELECT * FROM `ТАБЛ` WHERE `СТАТУС` !=3 ORDER BY `ТАБЛ`.`ДАТА` DESC) LIMIT 0,40 Выводятся все записи где СТАТУС =3, а потом все остальные записи, но не отсортированные по дате (SELECT * FROM `ТАБЛ` WHERE `СТАТУС` =3) UNION (SELECT * FROM `ТАБЛ` WHERE `СТАТУС` !=3) ORDER BY `ДАТА` DESC LIMIT 0,40 Выводятся записи отсортированные по ДАТЕ, но не в том порядке какой мне нужен... Подскажите как мне составить запрос, что бы получить то, что мне нужно... или одним запросом не получится?
Код (Text): SELECT * FROM ( SELECT * FROM `table` WHERE `payment`="true" ORDER BY `good_name` ASC ) a UNION select * from ( SELECT * FROM `table` WHERE `payment`="false" ORDER BY `name` ASC ) b Добавлено спустя 38 секунд: Извращение, но так работает, это не ваш пример но оч похож
Потому что по сути это двойная сортировка, сначало по парамтру СТАТУС , потом по времени. Только есть ньюансы так как статусов больше двух, то вы хотите сначало получить какой то один статус, а остальное оставить в перемешку отсортировав по времени. Тоесть таблица разделена на две части и если цветом не выделять это разделение и заставить пользователя понять как отсортирована таблица (по датам или по статусу), то в некоторых случаях пользователь может послать далеко такую логику сортировки. Например другому пользователю будет интересен не статус "3" а статус "2" в первую очередь. Но тогда зачем показывать остальное отсортированное по времени? Ведь мы только что явно сказали, что пользователю вдруг стал интересен статус "2", то есть было бы неплохо выводить таблицу стандартными методами (сортировка по одному или нескольким полям одновременно), а если полюзователю интересны какие-то выборочные данные, то добавить "уточняющие поля поиска" или "дополнительные фильтры" - называйте как хотите... К тому же с UNION можно нарваться на грабли с SQL_CALC_FOUND_ROWS и LIMIT, как то там волшебно всё получается =)
В комментах на Хабре я встретил такую конструкцию: Код (Text): SELECT * FROM ТАБЛ ORDER BY СТАТУС, CASE WHEN СТАТУС= 1 THEN ДАТА ELSE ДАТА END DESC тоже не корректно (при СТАТУСЕ больше двух значений)... как вариант СТАТУС можно определить только в двух значениях и тогда будет корректно работать данный запрос Что-то я перемудрил, вот вариант попроще будет при статусе с двумя значениями Код (Text): SELECT * FROM `ТАБЛ` ORDER BY `СТАТУС` DESC,`ДАТА` DESC
Уточняю: то что это извращение это совсем не значит что это неправильно. Может в некоторых случаях и есть смыл.... Ведь действительно если статусов больше двух (1..5), то при сортировке в прямом или обратном порядке мы легко увидим статусы 1 и 5, а до статуса 3 прийдётся "листать" таблицу. Тут нужно уже читать книгу "Юзабилити"... В общем все всё поняли чо продолжать то )