Добрый день, есть запрос ordery by в запросе Код (Text): ORDER BY (p.active > 0) DESC, p.services DESC, p.date_added DESC Мне нужно доработать запрос, чтобы если p.services > 1, то запрос был таким Код (Text): ORDER BY (p.active > 0) DESC, p.services DESC, p.date_added DESC , а если p.services < 2 то Код (Text): ORDER BY (p.active > 0) DESC, p.date_added DESC , то бишь для записей у которых p.services < 2 отключать из сортировки order by и чтобы они сортировались по Код (Text): (p.active > 0) DESC, p.services DESC, p.date_added DESC . Я пробовал так: Код (Text): 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, в рамках запроса
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/