За последние 24 часа нас посетили 22645 программистов и 1011 роботов. Сейчас ищут 717 программистов ...

IF else в ORDER BY

Тема в разделе "MySQL", создана пользователем JonyFront, 18 фев 2022.

  1. JonyFront

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

    С нами с:
    5 июн 2016
    Сообщения:
    143
    Симпатии:
    1
    Добрый день, есть запрос ordery by в запросе
    Код (Text):
    1. ORDER BY (p.active > 0) DESC, p.services DESC, p.date_added DESC
    Мне нужно доработать запрос, чтобы если p.services > 1, то запрос был таким
    Код (Text):
    1. ORDER BY (p.active > 0) DESC, p.services DESC, p.date_added DESC
    , а если p.services < 2 то
    Код (Text):
    1. ORDER BY (p.active > 0) DESC, p.date_added DESC
    , то бишь для записей у которых p.services < 2 отключать из сортировки order by и чтобы они сортировались по
    Код (Text):
    1. (p.active > 0) DESC, p.services DESC, p.date_added DESC
    .
    Я пробовал так:
    Код (Text):
    1. ORDER BY (p.active > 0) DESC, IF(p.services > 1, 'p.services DESC,', '') p.date_added DESC
    , но выдает ошибку синтаксиса, т.к. как я понял нельзя в IF использовать DESC и запятую...
    Идея в том, чтобы если у записи p.services > 1 , то она выше в списке, а если p.services < 2 , то сортировка идет дальше по active и по дате (date_added). Я думал оставить всегда так ORDER BY (p.active > 0) DESC, p.services DESC, p.date_added DESC, но как выставлять значения p.services, чтобы когда < 2, то выше были с актуальной датой(date_added), то бишь минуя p.services, пробовал выставлять services = -1, но все равно сортировка работает по p.services, и уже только в конце по date_added
    Подскажите, пожалуйста, как лучше это реализовать, без применения php, в рамках запроса
     
  2. artoodetoo

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

    С нами с:
    11 июн 2010
    Сообщения:
    11.072
    Симпатии:
    1.237
    Адрес:
    там-сям
    1) Не знаю в курсе ли ты, что (p.active > 0) будет выдавать значения 1 (истина) или 0 (ложь). Соответственно сортировка desc поместит в начале все истинные значения, затем все ложные. Теперь ты точно в курсе.
    2) "у которых xxx отключать из сортировки order by yyy" — низзя! ну низзя и всё. только ты неправильно понял почему. Возвращаемся опять к тому что сортируется. IF-ы тут вообще не работают в привычном смысле! Не получится буквально выбирать сортировку. Но можно сочинить выражение, которое будет выдавать значения для сортировки. Внутри этого выражения могут быть условные функции. А в конце можно добавить слово desc чтобы изменить направление сортировки. Несколько сортировок можно перечислить через запятую в порядке их приоритета.

    Например, сначала сортируем по количеству золотых медалей, затем по количеству серебряных, затем по количеству бронзовых. Каждый раз добавляем слово desc и перечисляем сортировки через запятую. Таков синтаксис.

    С условной функцией можно, например так: "ORDER BY IF(p.active > 0, p.services, p.date_added) asc" . Заменить буквально asc на desc по условию не получится. :( Можно делать трюки вроде "IF(condition, number_field, -number_field)" и это будет менять порядок сортировки.
    К строковому полю ты не можешь добавить знак минус, это усложняет дело. Я могу придумать трюки и для них, но они громоздкие.
    Удачи тебе!

    https://www.mysqltutorial.org/mysql-if-function.aspx
    https://www.mysqltutorial.org/mysql-order-by/
     
    JonyFront нравится это.
  3. JonyFront

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

    С нами с:
    5 июн 2016
    Сообщения:
    143
    Симпатии:
    1
    Спасибо большое за пояснение, суть уловил!)