За последние 24 часа нас посетили 18585 программистов и 1599 роботов. Сейчас ищут 947 программистов ...

UNION и сортировка

Тема в разделе "MySQL", создана пользователем Goodeeny, 17 окт 2013.

  1. Goodeeny

    Goodeeny Новичок

    С нами с:
    17 окт 2013
    Сообщения:
    4
    Симпатии:
    0
    Привет!
    Ищу ответ, но пока не нашел... может быстрее мне помогу здесь...
    Есть таблица ТАБЛ
    в ней есть два поля СТАТУС (принимает значение от 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
    Выводятся записи отсортированные по ДАТЕ, но не в том порядке какой мне нужен...
    Подскажите как мне составить запрос, что бы получить то, что мне нужно...
    или одним запросом не получится?
     
  2. Yadfewm

    Yadfewm Активный пользователь

    С нами с:
    20 июл 2009
    Сообщения:
    223
    Симпатии:
    0
    Код (Text):
    1. SELECT * FROM (
    2.    SELECT * FROM `table` WHERE `payment`="true" ORDER BY `good_name` ASC
    3. ) a
    4. UNION
    5. select * from (
    6.    SELECT * FROM `table` WHERE `payment`="false" ORDER BY `name` ASC
    7. ) b
    Добавлено спустя 38 секунд:
    Извращение, но так работает, это не ваш пример но оч похож
     
  3. Goodeeny

    Goodeeny Новичок

    С нами с:
    17 окт 2013
    Сообщения:
    4
    Симпатии:
    0
    Работает.... спс. помоему на Хабре я данный пример встретил...
    а почему извращение?
     
  4. Yadfewm

    Yadfewm Активный пользователь

    С нами с:
    20 июл 2009
    Сообщения:
    223
    Симпатии:
    0
    Потому что по сути это двойная сортировка, сначало по парамтру СТАТУС , потом по времени. Только есть ньюансы так как статусов больше двух, то вы хотите сначало получить какой то один статус, а остальное оставить в перемешку отсортировав по времени. Тоесть таблица разделена на две части и если цветом не выделять это разделение и заставить пользователя понять как отсортирована таблица (по датам или по статусу), то в некоторых случаях пользователь может послать далеко такую логику сортировки. Например другому пользователю будет интересен не статус "3" а статус "2" в первую очередь. Но тогда зачем показывать остальное отсортированное по времени? Ведь мы только что явно сказали, что пользователю вдруг стал интересен статус "2", то есть было бы неплохо выводить таблицу стандартными методами (сортировка по одному или нескольким полям одновременно), а если полюзователю интересны какие-то выборочные данные, то добавить "уточняющие поля поиска" или "дополнительные фильтры" - называйте как хотите...

    К тому же с UNION можно нарваться на грабли с SQL_CALC_FOUND_ROWS и LIMIT, как то там волшебно всё получается =)
     
  5. Goodeeny

    Goodeeny Новичок

    С нами с:
    17 окт 2013
    Сообщения:
    4
    Симпатии:
    0
    В комментах на Хабре я встретил такую конструкцию:
    Код (Text):
    1. SELECT * FROM ТАБЛ ORDER BY СТАТУС, CASE WHEN СТАТУС= 1 THEN ДАТА ELSE ДАТА END DESC
    тоже не корректно (при СТАТУСЕ больше двух значений)... как вариант СТАТУС можно определить только в двух значениях и тогда будет корректно работать данный запрос
    Что-то я перемудрил, вот вариант попроще будет при статусе с двумя значениями
    Код (Text):
    1. SELECT * FROM `ТАБЛ` ORDER BY `СТАТУС` DESC,`ДАТА` DESC
     
  6. Yadfewm

    Yadfewm Активный пользователь

    С нами с:
    20 июл 2009
    Сообщения:
    223
    Симпатии:
    0
    Уточняю: то что это извращение это совсем не значит что это неправильно. Может в некоторых случаях и есть смыл....
    Ведь действительно если статусов больше двух (1..5), то при сортировке в прямом или обратном порядке мы легко увидим статусы 1 и 5, а до статуса 3 прийдётся "листать" таблицу.

    Тут нужно уже читать книгу "Юзабилити"... В общем все всё поняли чо продолжать то )
     
  7. Goodeeny

    Goodeeny Новичок

    С нами с:
    17 окт 2013
    Сообщения:
    4
    Симпатии:
    0
    спасибо