Eu quero usar a ordem com a união na consulta mysql. Estou buscando diferentes tipos de registro com base em critérios diferentes de uma tabela com base na distância para uma pesquisa no meu site. A primeira consulta de seleção retorna dados relacionados à pesquisa exata do local. A 2ª consulta de seleção retorna dados relacionados à distância dentro de 5 km do local pesquisado. A terceira consulta de seleção retorna dados relacionados à distância entre 5 e 15 km do local pesquisado.
Em seguida, estou usando union para mesclar todos os resultados e mostrar em uma página com paginação. Sob o cabeçalho apropriado como 'Resultados de pesquisa exata' , 'Resultados dentro de 5 km' etc.
Agora eu quero classificar os resultados com base no id ou add_date. Mas quando adiciono ordem por cláusula no final da minha consulta (query1 union query 2 union query 3 order by add_date). Classifica todos os resultados. Mas o que eu quero é que deve classificar em cada título.
fonte
Respostas:
Você pode fazer isso adicionando uma pseudo-coluna denominada rank a cada seleção, para classificar primeiro, antes de classificar por outros critérios, por exemplo:
fonte
a
e o fim?order by
? ( "para classificar ou limitar oUNION
resultado inteiro , entre parênteses asSELECT
instruções individuais e coloque aORDER BY
ouLIMIT
após a última" ). Compare seu código com i.stack.imgur.com/LpTMU.pngVocê pode usar subconsultas para fazer isso:
fonte
SELECT * FROM ( SELECT aaa AS Col, 1 AS Official FROM table1 UNION ALL SELECT bbb AS Col, 0 AS Official FROM table2 ) AS tbl ORDER BY Official, Col
ORDER BY
para individuaisSELECT
declarações implica nada sobre a ordem em que as linhas aparecem no resultado finalfonte
Uma consulta de união pode ter apenas uma
ORDER BY
cláusula mestre , IIRC. Para conseguir isso, em cada consulta que compõem a maiorUNION
consulta, adicione um campo que vai ser o único campo você classificar por para osUNION
'sORDER BY
.Por exemplo, você pode ter algo como
Esse
union_sort
campo pode ser qualquer coisa que você queira classificar. Neste exemplo, acontece apenas de colocar os resultados da primeira tabela em primeiro lugar, da segunda tabela em segundo, etc.fonte
Não se esqueça, a união all é uma maneira de adicionar registros a um conjunto de registros sem classificar ou mesclar (em oposição à união).
Então, por exemplo:
Ele mantém as consultas individuais mais claras e permite que você classifique por diferentes parâmetros em cada consulta. No entanto, usando o caminho da resposta selecionada, pode ficar mais claro, dependendo da complexidade e da relação dos dados, porque você está conceituando a classificação. Ele também permite que você retorne a coluna artificial ao programa de consulta para que ele tenha um contexto que possa ser classificado ou organizado.
Mas dessa maneira, tem a vantagem de ser rápido, não introduzir variáveis extras e facilitar a separação de cada consulta, incluindo a classificação. A capacidade de adicionar um limite é simplesmente um bônus extra.
E, é claro, fique à vontade para transformar a união em união e adicionar uma classificação para toda a consulta. Ou adicione um ID artificial; nesse caso, dessa maneira, será fácil classificar por parâmetros diferentes em cada consulta, mas, caso contrário, será o mesmo que a resposta aceita.
fonte
Eu consegui isso trabalhando em uma união mais união.
fonte
Quando você usa uma
ORDER BY
cláusula dentro de uma subconsulta usada em conjunto com umUNION
mysql, ela otimizará aORDER BY
cláusula.Isso ocorre porque, por padrão, a
UNION
retorna uma lista não ordenada e, portanto,ORDER BY
não faria nada.A otimização é mencionada nos documentos e diz:
A última frase disso é um pouco enganadora, porque deve ter um efeito. Essa otimização causa um problema quando você está em uma situação em que precisa solicitar na subconsulta.
Para forçar o MySQL a não fazer essa otimização, você pode adicionar uma cláusula LIMIT da seguinte forma:
Um valor alto
LIMIT
significa que você pode adicionar umaOFFSET
consulta geral se desejar fazer algo como paginação.Isso também oferece o benefício adicional de poder
ORDER BY
colunas diferentes para cada união.fonte
Experimentar:
Onde [QUERY 1] e [QUERY 2] são suas duas consultas que você deseja mesclar.
fonte
Isso ocorre porque você está classificando todo o conjunto de resultados, deve classificar todas as partes da união separadamente ou pode usar a cláusula ORDER BY (algo como distância da subconsulta) THEN (algo como código da linha)
fonte
Tentei adicionar o pedido em cada uma das consultas antes da união, como
mas não parecia funcionar. Na verdade, ele não fazia o pedido nas linhas de cada seleção.
Acho que você precisará manter a ordem do lado de fora e adicionar as colunas na cláusula where à ordem de, algo como
Isso pode ser um pouco complicado, já que você deseja agrupar por intervalos, mas acho que deve ser possível.
fonte