Ir para conteúdo

POWERED BY:

Arquivado

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

Edu Salinas

[Resolvido] UNION ORDER BY e DATA

Recommended Posts

Oi, Com a ajuda dos colegas deste forum estou fazendo um trabalho com banco de dados.

 

 

Quando se usa o UNION, o ORDER BY para de funcionar, a solução que eu encontrei foi substituir o nome do campo pelo número da posição em que ele se encontra no SELECT. Funciona, porém como se trata de data, ele ordena levando em conta somente o dia.

 

$result1 = mysql_db_query("usuário", "SELECT DATE_FORMAT(proximovenc1, '%d/%m/%Y') AS vencimento, locador FROM adm

HAVING vencimento <= DATE_FORMAT(NOW(), '%d:%m:%Y')

UNION ALL SELECT DATE_FORMAT(proximovenc2, '%d/%m/%Y') AS vencimento, locador FROM adm

HAVING vencimento <= DATE_FORMAT(NOW(), '%d:%m:%Y') ORDER BY 2");

 

Porém o resultado volta da seguinte maneira, ordenado apenas pelo dia e não pela data.

 

00/00/0000--------Milton

00/00/0000--------Milton

01/02/1969--------ddddd

01/02/2010--------EDUARDO

01/03/1969--------ddddd

01/03/2010--------EDUARDO

02/02/1969--------eduuuu

02/02/2010--------DUDU

02/03/1969--------eduuuu

02/03/2010--------DUDU

03/05/2010--------gomes

03/06/2010--------gomes

04/10/2010--------midori

04/11/2010--------midori

20/01/2011--------Edu

20/12/2010--------Edu

 

 

Se alguém puder dar uma ajuda, grato.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Por se tratar de uma dúvida de MySQL o tópico foi movido para a sessão correta.

 

Abraços.

Compartilhar este post


Link para o post
Compartilhar em outros sites

O exemplo abaixo não funcionou??

 

$result1 = mysql_db_query("usuário", "SELECT tabela.* FROM (SELECT DATE_FORMAT(venc1, '%d/%m/%Y') AS vencimento, locador, proximovenc1 AS proximovenc FROM adm 
                                                         HAVING vencimento >= DATE_FORMAT(NOW(), '%d:%m:%Y')
                                UNION SELECT DATE_FORMAT(venc2, '%d/%m/%Y') AS vencimento, locador, proximovenc2 AS proximovenc FROM adm 
                                                         HAVING vencimento >= DATE_FORMAT(NOW(), '%d:%m:%Y')
                                ) AS tabela ORDER BY tabela.proximovenc ASC");
O que deu de errado? :huh:

 

Poste a estrutura das tabelas ao qual você deseja fazer o UNION para que o pessoal possa te ajudar.

 

Abraços.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Então, a página abre mas não mostra resultado.

 

Até mais,

 

 

 

 

<?

 

 

$result1 = mysql_db_query("usuário", "SELECT tabela.* FROM (SELECT DATE_FORMAT(proximovenc1, '%d/%m/%Y') AS vencimento, locador, proximovenc1 AS proximovenc FROM adm

HAVING vencimento >= DATE_FORMAT(NOW(), '%d:%m:%Y')

UNION SELECT DATE_FORMAT(proximovenc2, '%d/%m/%Y') AS vencimento, locador, proximovenc2 AS proximovenc FROM adm

HAVING vencimento >= DATE_FORMAT(NOW(), '%d:%m:%Y')

) AS tabela ORDER BY tabela.proximovenc ASC");

 

 

 

while ($array = mysql_fetch_assoc($result1))

 

 

{

echo '<tr><td width="150px">'.implode('--------',$array).'<br></td></tr>';

 

}

 

 

?>

 

 

Field Type Null Key Default Extra

id int(11) PRI NULL auto_increment

locador varchar(50)

locatario varchar(50)

endereço varchar(50)

iniciodocontrato date 0000-00-00

terminodocontrato date 0000-00-00

vencimento date 0000-00-00

valor varchar(10)

garantia varchar(20)

link varchar(50)

janeiro varchar(10)

fevereiro varchar(10)

março varchar(10)

abril varchar(10)

maio varchar(10)

junho varchar(10)

julho varchar(10)

agosto varchar(10)

setembro varchar(10)

outubro varchar(10)

novembro varchar(10)

dezembro varchar(10)

retiradajaneiro varchar(10)

retiradafevereiro varchar(10)

retiradamarço varchar(10)

retiradaabril varchar(10)

retiradamaio varchar(10)

retiradajunho varchar(10)

retiradajulho varchar(10)

retiradaagosto varchar(10)

retiradasetembro varchar(10)

retiradaoutubro varchar(10)

retiradanovembro varchar(10)

retiradadezembro varchar(10)

repassejaneiro varchar(10)

repassefevereiro varchar(10)

repassemarço varchar(10)

repasseabril varchar(10)

repassemaio varchar(10)

repassejunho varchar(10)

repassejulho varchar(10)

repasseagosto varchar(10)

repassesetembro varchar(10)

repasseoutubro varchar(10)

repassenovembro varchar(10)

repassedezembro varchar(10)

comentario varchar(200)

datadocadastro date 0000-00-00

pasta varchar(5) UNI

proximovenc1 date 0000-00-00

proximovenc2 date 0000-00-00

proximovenc3 date 0000-00-00

proximovenc4 date 0000-00-00

proximovenc5 date 0000-00-00

proximovenc6 date 0000-00-00

proximovenc7 date 0000-00-00

proximovenc8 date 0000-00-00

proximovenc9 date 0000-00-00

proximovenc10 date 0000-00-00

proximovenc11 date 0000-00-00

proximovenc12 date 0000-00-00

proximovenc13 date 0000-00-00

proximovenc14 date 0000-00-00

proximovenc15 date 0000-00-00

proximovenc16 date 0000-00-00

proximovenc17 date 0000-00-00

proximovenc18 date 0000-00-00

proximovenc19 date 0000-00-00

proximovenc20 date 0000-00-00

proximovenc21 date 0000-00-00

proximovenc22 date 0000-00-00

proximovenc23 date 0000-00-00

proximovenc24 date 0000-00-00

proximovenc25 date 0000-00-00

proximovenc26 date 0000-00-00

proximovenc27 date 0000-00-00

proximovenc28 date 0000-00-00

proximovenc29 date 0000-00-00

proximovenc30 date 0000-00-00

Compartilhar este post


Link para o post
Compartilhar em outros sites

Se não mostra o resultado na tela execute a query
no phpMyAdmin e veja que registros ela traz.

As vezes o erro não está na query e sim nos registros
selecionados do código.
:o que estrutura é essa cara????

 

Ta as duas tabelas ai???? :(

 

Cara agora eu entendi menos ainda a sua query. :huh:

 

Você ta fazendo UNION da sua tabela com a sua tabela mesmo???

Porque tem 30 campos de vencimento??? :huh:

 

Abraços.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Somente uma tabela, são 30 campos de vencimentos, pois para cada cadastro eu gero 30 vencimentos para cada cliente, que é o período de um contrato. Tipo, cliente A com seus 30 vencimentos, cliente B com seus 30 vencimentos.

 

 

Então, o resultado é satisfatório quando faço o seguinte.

 

 

$result1 = mysql_db_query("usuário", "(SELECT proximovenc1, locador FROM adm WHERE proximovenc1 <= DATE_FORMAT(NOW(), '%Y:%m:%d'))

UNION ALL (SELECT proximovenc2, locador FROM adm WHERE proximovenc2 <= DATE_FORMAT(NOW(), '%Y:%m:%d'))

UNION ALL (SELECT proximovenc3, locador FROM adm WHERE proximovenc3 <= DATE_FORMAT(NOW(), '%Y:%m:%d'))

UNION ALL (SELECT proximovenc4, locador FROM adm WHERE proximovenc4 <= DATE_FORMAT(NOW(), '%Y:%m:%d'))

UNION ALL (SELECT proximovenc5, locador FROM adm WHERE proximovenc5 <= DATE_FORMAT(NOW(), '%Y:%m:%d')) ORDER BY proximovenc1 DESC");

 

 

while ($array = mysql_fetch_assoc($result1)) {

echo '<tr><td width="150px">'.implode('---------- ',$array).'<br></td></tr>';

 

}

 

 

?>

 

 

Porém, a data fica no padrão amerciano.

Quando eu coloco o DATE_FORMAT, para a data sair no padrão correto é que tudo começa a dar errado, pois parece que entra em atrito com o ORDER BY.

Então substituo o valor do campo por um número, porém o resultado volta ordenado apenas pelo dia.

 

No mais, desculpe-me pela minha ignorância, tem poucos dias que estou usando php.

 

Até mais,

Compartilhar este post


Link para o post
Compartilhar em outros sites

Em primeiro lugar isso não é usar PHP e sim MySQL.

O PHP apenas executa a query e trata os resultados.

O problema está na query, portanto, é MySQL. ^_^

 

Cara pelo amor de Deus 30 vencimentos você fez 30 campos???? :o

Quando for assim crie uma tabela chamada vencimentos e faça uma constraint

entre a tabela adm e a de vencimentos. http://forum.imasters.com.br/public/style_emoticons/default/ermm.gif

 

Estude melhor modelação de base de dados porque o que fez chega a ser um crime. :P

Por isso você está "se matando" com essa query. Procure no google por Foreign Key MySQL e procure também por Inner Join.

São elementos essenciais em uma base de dados consistente. Procure também por Relacionamento entre tabelas MySQL e também por InnoDB.

 

Esta formatação '%Y:%m:%d' está errada. Isso é formatação de hora. O correto seria '%Y-%m-%d'.

Cara fazer as coisas sem entender é muito complicado. Tem muita coisa errada. Vai ter que fazer uma query

imensa e ainda por cima extremamente lenta quando se fala em volume de dados.

 

Tente com os exemplos abaixo.

 

$result1 = mysql_db_query("usuário", "SELECT DATE_FORMAT(tb.proximovenc1, '%d/%m/%Y') AS proximovenc1,
                                             DATE_FORMAT(tb.proximovenc2, '%d/%m/%Y') AS proximovenc2,
                                             DATE_FORMAT(tb.proximovenc3, '%d/%m/%Y') AS proximovenc3,
                                             DATE_FORMAT(tb.proximovenc4, '%d/%m/%Y') AS proximovenc4,
                                             DATE_FORMAT(tb.proximovenc5, '%d/%m/%Y') AS proximovenc5,
                                             tb.locador FROM (SELECT proximovenc1, locador FROM adm WHERE proximovenc1 <= DATE_FORMAT(NOW(), '%Y-%m-%d'))
UNION ALL (SELECT proximovenc2, locador FROM adm WHERE proximovenc2 <= DATE_FORMAT(NOW(), '%Y-%m-%d'))
UNION ALL (SELECT proximovenc3, locador FROM adm WHERE proximovenc3 <= DATE_FORMAT(NOW(), '%Y-%m-%d'))
UNION ALL (SELECT proximovenc4, locador FROM adm WHERE proximovenc4 <= DATE_FORMAT(NOW(), '%Y-%m-%d'))
UNION ALL (SELECT proximovenc5, locador FROM adm WHERE proximovenc5 <= DATE_FORMAT(NOW(), '%Y-%m-%d')) ORDER BY proximovenc1 DESC) AS tb";
ou

 

$result1 = mysql_db_query("usuário", "SELECT DATE_FORMAT(tb.proximovenc1, '%d/%m/%Y') AS proximovenc1,
                                             DATE_FORMAT(tb.proximovenc2, '%d/%m/%Y') AS proximovenc2,
                                             DATE_FORMAT(tb.proximovenc3, '%d/%m/%Y') AS proximovenc3,
                                             DATE_FORMAT(tb.proximovenc4, '%d/%m/%Y') AS proximovenc4,
                                             DATE_FORMAT(tb.proximovenc5, '%d/%m/%Y') AS proximovenc5,
                                             tb.locador FROM (SELECT proximovenc1, locador FROM adm WHERE proximovenc1 <= DATE_FORMAT(NOW(), '%Y-%m-%d'))
UNION ALL (SELECT proximovenc2, locador FROM adm WHERE proximovenc2 <= DATE_FORMAT(NOW(), '%Y-%m-%d'))
UNION ALL (SELECT proximovenc3, locador FROM adm WHERE proximovenc3 <= DATE_FORMAT(NOW(), '%Y-%m-%d'))
UNION ALL (SELECT proximovenc4, locador FROM adm WHERE proximovenc4 <= DATE_FORMAT(NOW(), '%Y-%m-%d'))
UNION ALL (SELECT proximovenc5, locador FROM adm WHERE proximovenc5 <= DATE_FORMAT(NOW(), '%Y-%m-%d'))) AS tb ORDER BY tb.proximovenc1 DESC";
Fazer código PHP mal estruturado por não ter conhecimento profundo eu mesmo já fiz muitos no inicio. Porém é algo que pode-se refazer.

 

Base de dados contem informações valiosas dos clientes. Agora imagine que você adiquiriu mais conhecimento e percebe que terá de refazer a base de dados? Refaze-la será o de menos. O pior será restaurar o backup pois você terá que encaixar milhares de registros manualmente. Da pra imaginar o tamanho do abacaxi? :huh:

 

Cara mesmo que de certo, pro seu bem, refaça isso da forma correta ou futuramente terá uma dor de cabeça sem tamanho.

 

Abraços.

 

P.S.

Para fazer da forma correta terá que pesquisar os termos que citei e estudar artigos, apostilas

e tantos outros conteúdos que se acha no google e em foruns.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Oi amigo, primeiramente muito obrigado não pela dica, mas pela aula.

Logo no início me veio a idéia de criar uma tabela somente para vencimentos.

Como não entendo, achei que não seria correto.

 

Vou estudar os comandos que você indicou e vou criar uma tabela somente para vencimentos.

 

 

Muito obrigado.

Até.

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.