2012-04-19 3 views
3

Можно создать дубликат:
Can you add “IF” statement in PHP MYSQL ORDER BY?MySQL: Как использовать IF условие ORDER

Как я могу использовать IF условие ORDER в MySQL?

Например, мой запрос ниже, возвращает ошибку,

SELECT * 
FROM page AS p 

WHERE p.parent_id != p.page_id 
AND p.type = 'post' 
AND p.parent_id = '7' 


IF(
    'date created' = 'date created', 
    ORDER BY p.created_on DESC, 
    ORDER BY p.created_on ASC 
) 

сообщение,

1064 - У Вас есть ошибка в вашем SQL синтаксиса; проверьте руководство, соответствующее версии вашего сервера MySQL, для правильного синтаксиса для использования рядом с «IF (« дата создана »=« дата создана », ORDER BY p.created_on DESC, ORDER BY стр. 'по строке 17

Первый 'дата создания' является переменной. Таким образом, если 'date created' = 'date created',

затем ORDER BY p.created_on DESC

еще ORDER BY p.created_on ASC

+0

нашел ответ здесь: http://stackoverflow.com/questions/3550942/can-you-add-if-statement-in-php-mysql-order- от – laukok

+0

Ваш вопрос неоднозначен, у меня сложилось впечатление, что вы задаете вопрос о том, как динамически упорядочить направление, как мы можем видеть из вашего вопроса, оба условия true и false совпадают с created_on, и они различаются только по направлению сортировки (DESC vs ASC) , В следующий раз сделайте свой вопрос свободным от двусмысленности –

ответ

5

Используйте это:

create table person 
(
    name varchar(50) 
); 


insert into person(name) 
select 'John' union 
select 'Paul' union 
select 'George' union 
select 'Ringo' ; 



set @direction = 1; 

-- the '' is ignored on sorting since they are all the same values 
select * from person 
order by 
    IF (@direction = 0, name,'') ASC, 
    IF (@direction = 1, name,'') DESC 

Живого тест: http://www.sqlfiddle.com/#!2/22ea1/1

Другого подход заключается в использовании -1 для убывающего направления, и +1 для восходящего направления, а затем умножить его на поле, работают только на единственном число полей :

create table person 
(
    name varchar(50), birth_year int 
); 


insert into person(name, birth_year) 
select 'John', 1940 union 
select 'Paul', 1941 union 
select 'George', 1943 union 
select 'Ringo', 1940 ; 


set @direction = -1; -- -1: descending, 1: ascending 

select * from person 
order by birth_year * @direction 

Живая тест: http://www.sqlfiddle.com/#!2/f78f3/3

Смежные вопросы