Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
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
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
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)
Thiago , posso estar errado pois não testei , mas digo sempre
Se funcionou deixa quieto ....
http://dev.mysql.com/doc/refman/5.0/en/union.html
However, use of ORDER BY for individual [SELECT](http://dev.mysql.com/doc/refman/5.0/en/select.html) statements implies nothing about the order in which the rows appear in the final result because [UNION](http://dev.mysql.com/doc/refman/5.0/en/union.html) 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](http://dev.mysql.com/doc/refman/5.0/en/select.html), even though it does not necessarily affect the order of those rows in the final [UNION](http://dev.mysql.com/doc/refman/5.0/en/union.html) result. If ORDER BY appears without LIMIT in a [SELECT](http://dev.mysql.com/doc/refman/5.0/en/select.html), 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](http://dev.mysql.com/doc/refman/5.0/en/union.html) result, parenthesize the individual [SELECT](http://dev.mysql.com/doc/refman/5.0/en/select.html) 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
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
z é pq no mysql toda subquery que for usada no from deve ter nome(alias). eu costumo usar "z"
Nao tem estes order by em cada select , pode ter ao final todavia.