Ir para conteúdo

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

hinom

condicional no ORDER BY

Recommended Posts

olá comunidade

 

estou com um pequeno problema numa consulta no mysql

 

eu preciso selecionar todos os registros de uma tabela e ordená-los de acordo com a data.

 

mas existe uma regra porque é uma agenda de eventos.

 

 

o que o script deveria fazer é ordenar em ordem crescente os registros cuja data é maior que a data de hoje

e ao mesmo, na mesma consulta ordenar em ordem decrescente os registros cuja data seja menor que a data de hoje

 

 

estrutura teste:

CREATE TABLE agenda (

  cod varchar(200) NOT NULL default '0',

  data_evento datetime NOT NULL default '0000-00-00 00:00:00',

  PRIMARY KEY  (cod)

) ENGINE=InnoDB;

dados para teste:

INSERT INTO agenda VALUES("20050223184534", "2005-06-20 15:40:00");

INSERT INTO agenda VALUES("20050223184533", "2005-05-12 15:30:00");

INSERT INTO agenda VALUES("20050223184532", "2005-02-22 13:40:00");

INSERT INTO agenda VALUES("20050223184531", "2005-01-23 13:10:00");

 

a instrução que chega mais próximo do que eu quero foi essa:

SELECT

cod,

IF((data_evento <= DATE_SUB(NOW(), INTERVAL 15 hour))

     ,CONCAT("|",data_evento)

     ,data_evento)

AS data_evento

FROM agenda

ORDER BY data_evento ASC

LIMIT 0,10

a condicional

IF((data_evento <= DATE_SUB(NOW(), INTERVAL 15 hour))     ,CONCAT("|",data_evento)     ,data_evento)
concatena um caracter no valor data_evento dos registros cuja data é menor que hoje. ou seja, os eventos que já foram realizados.

até aí tudo bem. mas a ordenação dos eventos realizados fica em ordem crescente. Eu preciso que retornem em ordem decrescente.

 

 

retornará isso:

20050223184533 - 2005-05-12 15:30:00

20050223184534 - 2005-06-20 15:40:00

20050223184531 - |2005-01-23 13:10:00

20050223184532 - |2005-02-22 13:40:00

 

eu precisaria de alguma função para mudar a ordenação dos dados.

no manual do mysql encontrei uma função, mas parece que não retorna corretamente.

 

 

SELECT

data_evento,

GROUP_CONCAT(data_evento <= DATE_SUB(NOW(), INTERVAL 15 hour) ORDER BY data_evento DESC)

AS novo

FROM agenda

GROUP BY data_evento ASC ORDER BY novo ASC

LIMIT 0,10

GROUP_CONCAT(data_evento <= DATE_SUB(NOW(), INTERVAL 15 hour) ORDER BY data_evento DESC)

Retornará "1" se a expressão 1 for verdadeira.

Retornará "0" se for falsa.

 

Até que funciona mas retorna o mesmo resultado da primeira instrução:

20050223184533 - 2005-05-12 15:30:00

20050223184534 - 2005-06-20 15:40:00

20050223184531 - 2005-01-23 13:10:00

20050223184532 - 2005-02-22 13:40:00

a intrução em negrito deveria retornar os dados em "azul" em ordem descrescente.

mas não o faz...

 

também não sei se estou fazendo certo.

 

 

agradeço quem puder ajudar.

obrigado pela atenção.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Acho q você precisa do operador UNION:

http://dev.mysql.com/doc/mysql/en/union.html

 

Seria algo assim:

(SELECT data_evento FROM agenda WHERE data_evento>=NOW() ORDER BY data_evento ASC)UNION(SELECT data_evento FROM agenda WHERE data_evento<NOW() ORDER BY data_evento DESC)

Pode ser q tenha algum erro de sintaxe, mas isso você mata né? Sucesso!

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.