За последние 24 часа нас посетили 20066 программистов и 1695 роботов. Сейчас ищут 1850 программистов ...

Сортировка в прямом и обратном порядке одновременно

Тема в разделе "MySQL", создана пользователем Nadya, 29 авг 2017.

  1. Nadya

    Nadya Новичок

    С нами с:
    29 авг 2017
    Сообщения:
    6
    Симпатии:
    0
    Добрый вечер!
    SQL знаю на пальцах, но очень нужно отсортировать таблицу:
    Сначала идут даты с сегодняшнего дня и будущие в обратном порядке,
    За ними даты прошедшие в прямом порядке.
    Т.е., например, есть таблица:

    date
    2017-09-02
    2017-09-08
    2017-09-16
    2017-10-20
    2017-05-08
    2017-08-29
    2017-08-15

    Сегодня, к примеру, 2017-08-29

    Нужно чтобы вывело:
    date
    2017-08-29
    2017-09-02
    2017-09-08
    2017-09-16
    2017-10-20 (дальше старые даты)
    2017-08-15
    2017-05-08


    Мой код:
    PHP:
    1. (
    2. SELECT date
    3. FROM tb
    4. WHERE date>= CURDATE( )
    5. ORDER BY date ASC
    6. )
    7. UNION (
    8.  
    9. SELECT date
    10. FROM tb
    11. WHERE date< CURDATE( )
    12. ORDER BY date DESC
    13. )
    Выводит ерунду:
    date[​IMG]
    2017-09-02
    2017-09-08
    2017-09-16
    2017-10-20
    2017-08-29
    2017-05-08
    2017-08-15
     
    #1 Nadya, 29 авг 2017
    Последнее редактирование модератором: 30 авг 2017
  2. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    хз. запросы правильные.
    попробуй сделай два запроса, а не юнион.
     
  3. Nadya

    Nadya Новичок

    С нами с:
    29 авг 2017
    Сообщения:
    6
    Симпатии:
    0
    Я как раз от двух запросов пыталась избавиться... Думала проще будет
     
  4. Nerfed

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

    С нами с:
    21 июл 2017
    Сообщения:
    186
    Симпатии:
    12
    Экранировать `date`?
     
  5. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    кавычки это не "экранировать", это кавычки
     
  6. Nadya

    Nadya Новичок

    С нами с:
    29 авг 2017
    Сообщения:
    6
    Симпатии:
    0
    Никак не влияет
     
  7. Nerfed

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

    С нами с:
    21 июл 2017
    Сообщения:
    186
    Симпатии:
    12
    Кавычкировать `date`?
    А при UNION сортировка во втором запросе точно не влияет на первый?
     
  8. Nadya

    Nadya Новичок

    С нами с:
    29 авг 2017
    Сообщения:
    6
    Симпатии:
    0
    Удалила везде ORDER BY, результат такой же. То есть не работает сортировка. В любом случае выбирает сначала все даты будущие (без сортировки), а потом все даты прошедшие.
    Как сделать, чтобы даты сортировались в кусках?
     
  9. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    если выбираешь по одному запросу за раз, то сортированные даты приходят?
     
  10. Nadya

    Nadya Новичок

    С нами с:
    29 авг 2017
    Сообщения:
    6
    Симпатии:
    0
    Да, отдельно

    PHP:
    1. SELECT date
    2. FROM tb
    3. WHERE date>= CURDATE( )
    4. ORDER BY date ASC
    работает, как и вторая часть
     
    #10 Nadya, 30 авг 2017
    Последнее редактирование модератором: 30 авг 2017
  11. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    ну и забей, бери двумя, сляпывай в пхп, на то он и нужен.
    это не та проблема, которую надо решать.
     
  12. Nadya

    Nadya Новичок

    С нами с:
    29 авг 2017
    Сообщения:
    6
    Симпатии:
    0
    так и придется, но жалко все-таки
     
  13. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    а юнион это не "один запрос". это два запроса и в производительности ты не выигрываешь.
     
  14. t1grok

    t1grok Новичок

    С нами с:
    29 янв 2017
    Сообщения:
    119
    Симпатии:
    32
    В доке же черным по белому написано:
    Use of ORDER BY for individual SELECT statements implies nothing about the order in which the rows appear in the final result because UNION by default produces an unordered set of rows

    А задача решается и без объединений.
    Код (Text):
    1. SELECT date FROM tb
    2. ORDER BY
    3. date >= CURDATE() DESC,
    4. CASE WHEN date >= CURDATE() THEN date END ASC,
    5. CASE WHEN date < CURDATE() THEN date END DESC
     
    retvizan, igordata и Nerfed нравится это.
  15. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    крутяк!