MySQL: order by + union all

Olá pessoALL! :frowning:

Estou com um problema para usar order by junto com union all. O problema ocorre em um union de diversos selects, e cada select é bem complexo, mas pra facilitar eu reproduzi o erro num select pequeno e mais simples. Vejam o que acontece.

Qdo rodo apenas o select1, ele lista tdo que eu quero certinho e ordenado como eu estou pedindo, ou seja, pela coluna descrição.

Select1:

select mo.codigo, mo.descricao, (case m.tiporegfin when '01' then 'A' when '60' then 'BB' when '70' then 'CCC' end) as detalhe, SUM(IFNULL(m.valortot,0)) as valor from movcaixa m left join modalid mo on mo.codigo = CAST(m.tipopagto as SIGNED) where m.datamovto = '2007/5/21' and m.status = '03' and m.tiporegfin in ('01','60','70') group by 1,2,3 order by mo.descricao

Então eu pego esse select1 e faço um UNION ALL com um select2. Abaixo como ficou:

[code](
select mo.codigo,
mo.descricao,
(case m.tiporegfin when ‘01’ then ‘A’
when ‘60’ then ‘BB’
when ‘70’ then ‘CCC’ end) as detalhe,
SUM(IFNULL(m.valortot,0)) as valor
from movcaixa m
left join modalid mo on mo.codigo = CAST(m.tipopagto as SIGNED)
where m.datamovto = ‘2007/5/21’
and m.status = ‘03’
and m.tiporegfin in (‘01’,‘60’,‘70’)
group by 1,2,3
order by mo.descricao
)

UNION ALL

(
select 0 as codigo,
‘Qualquer coisa’ as descricao,
‘Outra coisa’ as detalhe,
0 as valor
from sismodu
limit 1
)[/code]

Quando executo, os valores estão corretos, mas ele desordena tudo! Minha intenção era que ele saísse os registros do select1 ordenados por descrição e depois, no final de tudo, o único registro do select2.

O que acontece é que ele lista realmente os registros do select1 e depois de tudo os registros do select2. Só que no select1 ele ordena tudo pela primeira coluna (coluna código) e não pelo que eu estou mandando.

Alguém pode me dizer pq ele sempre ordena pela primeira coluna?

Por favor!!! Lembrem-se de que esse é um exemplo pequeno que eu fiz para que entendam o problema, não adianta me responder: “Coloque a descrição como sendo a primeira coluna e tudo estará resolvido”, ok? :?

Conto com a ajuda de vcs!!! :wink:

Grata,
Renata

[quote=RenataFA]Olá pessoALL! :frowning:

Estou com um problema para usar order by junto com union all. O problema ocorre em um union de diversos selects, e cada select é bem complexo, mas pra facilitar eu reproduzi o erro num select pequeno e mais simples. Vejam o que acontece.

Qdo rodo apenas o select1, ele lista tdo que eu quero certinho e ordenado como eu estou pedindo, ou seja, pela coluna descrição.

Select1:

select mo.codigo, mo.descricao, (case m.tiporegfin when '01' then 'A' when '60' then 'BB' when '70' then 'CCC' end) as detalhe, SUM(IFNULL(m.valortot,0)) as valor from movcaixa m left join modalid mo on mo.codigo = CAST(m.tipopagto as SIGNED) where m.datamovto = '2007/5/21' and m.status = '03' and m.tiporegfin in ('01','60','70') group by 1,2,3 order by mo.descricao

Então eu pego esse select1 e faço um UNION ALL com um select2. Abaixo como ficou:

[code](
select mo.codigo,
mo.descricao,
(case m.tiporegfin when ‘01’ then ‘A’
when ‘60’ then ‘BB’
when ‘70’ then ‘CCC’ end) as detalhe,
SUM(IFNULL(m.valortot,0)) as valor
from movcaixa m
left join modalid mo on mo.codigo = CAST(m.tipopagto as SIGNED)
where m.datamovto = ‘2007/5/21’
and m.status = ‘03’
and m.tiporegfin in (‘01’,‘60’,‘70’)
group by 1,2,3
order by mo.descricao
)

UNION ALL

(
select 0 as codigo,
‘Qualquer coisa’ as descricao,
‘Outra coisa’ as detalhe,
0 as valor
from sismodu
limit 1
)[/code]

Quando executo, os valores estão corretos, mas ele desordena tudo! Minha intenção era que ele saísse os registros do select1 ordenados por descrição e depois, no final de tudo, o único registro do select2.

O que acontece é que ele lista realmente os registros do select1 e depois de tudo os registros do select2. Só que no select1 ele ordena tudo pela primeira coluna (coluna código) e não pelo que eu estou mandando.

Alguém pode me dizer pq ele sempre ordena pela primeira coluna?

Por favor!!! Lembrem-se de que esse é um exemplo pequeno que eu fiz para que entendam o problema, não adianta me responder: “Coloque a descrição como sendo a primeira coluna e tudo estará resolvido”, ok? :?

Conto com a ajuda de vcs!!! :wink:

Grata,
Renata[/quote]

Então Renata, não sei se chegou a resolver, ja faz tanto tempo, estava agora com o mesmo problema, não achei uma solução bacana para o mesmo, no entanto acabei inserindo no meu select uma coluna extra, assim:

(Select nome, ‘a’ from tabela)
union
(Select nome, ‘b’ from tabela)
order by a, nome

Assim primeiramente ele ordena os selects e depois o nome, se tiver uma solução mais inteligente, posta ai pois ainda estou procurando uma melhor.

vc pode colocar o order by do primeiro select direto na consulta do union:

select * from ( (/*select1*/) UNION ALL (/*select2*/) ) order by descricao

vc pode colocar o order by do primeiro select direto na consulta do union:

select * from ( (/*select1*/) UNION ALL (/*select2*/) ) order by descricao[/quote]

Até tentei fazer desta forma, só que ele junta os dois selects em uma tabela só e depois ordena, isto faz com que não fique distinto os selects.

Este é um bug do MySQL que consta na base de bugs do MySQL desde 5 de dezembro de 2005 e foi considerado como um “recurso” do MySQL e não foi corrigido.

um possível workaround, é incluir no final de cada um dos Selects internos um limit com um número “infinito”.
Ex:

(select ......
  order by ....
  limit 99999999999
)
union
(select ......
  order by ....
  limit 99999999999
)

Mais informações na página do bug do MySQL:
http://bugs.mysql.com/bug.php?id=15751