Ir para conteúdo

POWERED BY:

Arquivado

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

Thiago Lenzi

UNION + ORDER By = erro? Mysql

Recommended Posts

Bom dia pessoal.

 

Estou montando um SELECT composto por INNER JOIN e mais 3 UNION. No entanto, ao ordenar pelo id, está dando erro.

 

 

Esse é o erro do Mysql -> #1221 - Incorrect usage of UNION and ORDER BY

 

Peço ajuda para formular esse SELECT com Order by id DECRESCENTE e aprender o motivo do erro.

 

 

Obrigado.

SELECT magazine1.link_top,
links_posts.nome
FROM links_posts1 INNER JOIN magazine1 
ON links_posts1.id=magazine1.fk_posts 
WHERE links_posts1.fk_amore=$id ORDER BY magazine1.id DESC

UNION

SELECT magazine2.link_top,
links_posts2.nome FROM 
links_posts2 INNER JOIN 
magazine2 ON 
links_posts2.id=magazine2.fk_posts 
WHERE 
links_posts2.fk_amore=$id ORDER BY magazine2.id DESC

UNION

SELECT magazine3.link_top,
links_posts3.nome FROM 
links_posts3 INNER JOIN 
magazine3 ON 
links_posts3.id=magazine3.fk_posts 
WHERE 
links_posts3.fk_amore=$id ORDER BY magazine3.id DESC


UNION

SELECT magazine4.link_top,
links_posts4.nome FROM 
links_posts4 INNER JOIN 
magazine4 ON 
links_posts4.id=magazine4.fk_posts 
WHERE 
links_posts4.fk_amore=$id ORDER BY magazine4.id DESC

Compartilhar este post


Link para o post
Compartilhar em outros sites

Nao tem estes order by em cada select , pode ter ao final todavia.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Nao pode ter UNION com ORDER BY no MySQL , a explicação do motivo é enjoada, mas tem a ver com a teoria de que dentro do banco as linhas nao tem ordem e são na verdade uma massa de dados.

 

Ex (Errado):

Select * from a order by id asc
UNION
Select * from b order by id desc

Ex (Correto):

Select * from
(
Select * from a
UNION
Select * from b 
) z 
order by id asc

Compartilhar este post


Link para o post
Compartilhar em outros sites

Nao tem estes order by em cada select , pode ter ao final todavia.

Motta, não serei arrogante em dizer que você está errado. Muito pelo contrario, quero questionar você.

 

Se não posso colocar order by em cada um deles, como que, fazendo assim(Cód. abaixo) deu certo?

 

Fiz um pouquinho diferente, mas não quero correr o risco de dar problemas. Me diga porque funcionou e se tem riscos.

(SELECT magazine1.link_top,
links_posts.nome
FROM links_posts1 INNER JOIN magazine1 
ON links_posts1.id=magazine1.fk_posts 
WHERE links_posts1.fk_amore=$id ORDER BY magazine1.id DESC)

UNION ALL

(SELECT magazine2.link_top,
links_posts2.nome FROM 
links_posts2 INNER JOIN 
magazine2 ON 
links_posts2.id=magazine2.fk_posts 
WHERE 
links_posts2.fk_amore=$id ORDER BY magazine2.id DESC)

UNION ALL

(SELECT magazine3.link_top,
links_posts3.nome FROM 
links_posts3 INNER JOIN 
magazine3 ON 
links_posts3.id=magazine3.fk_posts 
WHERE 
links_posts3.fk_amore=$id ORDER BY magazine3.id DESC)


UNION ALL

(SELECT magazine4.link_top,
links_posts4.nome FROM 
links_posts4 INNER JOIN 
magazine4 ON 
links_posts4.id=magazine4.fk_posts 
WHERE 
links_posts4.fk_amore=$id ORDER BY magazine4.id DESC)

Compartilhar este post


Link para o post
Compartilhar em outros sites

Thiago , posso estar errado pois não testei , mas digo sempre

 

Se funcionou deixa quieto ....

Compartilhar este post


Link para o post
Compartilhar em outros sites

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

 

However, use of ORDER BY for individual SELECT statements implies nothing about the order in which the rows appear in the final result because UNION by default produces an unordered set of rows. Therefore, the use of ORDER BY in this context is typically in conjunction with LIMIT, so that it is used to determine the subset of the selected rows to retrieve for the SELECT, even though it does not necessarily affect the order of those rows in the final UNION result. If ORDER BY appears without LIMIT in a SELECT, it is optimized away because it will have no effect anyway.

To use an ORDER BY or LIMIT clause to sort or limit the entire UNION result, parenthesize the individual SELECT statements and place the ORDER BY or LIMIT after the last one.

O que significa que nao tem sentido usar o order by com union se nao for pra limitar o conjunto resultante. Porém como disse o Motta, se funcionou pra vc otimo :D

Compartilhar este post


Link para o post
Compartilhar em outros sites

O que significa que nao tem sentido usar o order by com union se nao for pra limitar o conjunto resultante. Porém como disse o Motta, se funcionou pra você otimo :D

 

Giesta. Agradeço o help. Depois de várias analises vejo. Funciona mas, sei que não foi tão efetivo e faz todo sentido não coloca-lo individualmente. Não tem lógica e não posso ir avante com conhecimento errado.

 

No entanto, quero que me dê um exemplo mais complexo envolvendo union e inner join com um order by desc no final.

 

Não compreendi o z no final.

 

Select * from
(
Select * from a
UNION
Select * from b 
) z 
order by id asc

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.