Como faço para concatenar conjuntos de resultados inteiros no MySQL?

votos
19

Estou tentando o seguinte consulta:

SELECT A,B,C FROM table WHERE field LIKE 'query%'
UNION
SELECT A,B,C FROM table WHERE field LIKE '%query'
UNION
SELECT A,B,C FROM table WHERE field LIKE '%query%'
GROUP BY B ORDER BY B ASC LIMIT 5

Isso é três consultas grudadas, meio sorta. No entanto, o conjunto de resultados que volta reflete os resultados de consulta # 3 antes dos resultados de consulta # 1, que é indesejável.

Existe alguma maneira de priorizar estes para que os resultados vêm como todos para consulta # 1, então tudo para consulta # 2, então tudo por consulta # 3? Eu não quero fazer isso em PHP apenas ainda (para não mencionar ter que controlar por resultados que apareceram na primeira consulta não mostrar na segunda e assim por diante).

Publicado 06/08/2008 em 19:47
fonte usuário
Em outras línguas...                            


7 respostas

votos
14

Talvez você devesse tentar incluindo uma quarta coluna, indicando a mesa veio, e em seguida, ordem e grupo por ele:

SELECT A,B,C, "query 1" as origin FROM table WHERE field LIKE 'query%'
UNION
SELECT A,B,C, "query 2" as origin FROM table WHERE field LIKE '%query'
UNION
SELECT A,B,C, "query 3" as origin FROM table WHERE field LIKE '%query%'
GROUP BY origin, B ORDER BY origin, B ASC LIMIT 5
Respondeu 06/08/2008 em 19:59
fonte usuário

votos
5

Adicionar uma coluna adicional com valores codificados que você vai usar para classificar o conjunto de resultados em geral, assim:

SELECT A,B,C,1 as [order] FROM table WHERE field LIKE 'query%'
UNION
SELECT A,B,C,2 as [order] FROM table WHERE field LIKE '%query'
UNION
SELECT A,B,C,3 as [order] FROM table WHERE field LIKE '%query%'
GROUP BY B ORDER BY [order] ASC, B ASC LIMIT 5
Respondeu 06/08/2008 em 19:55
fonte usuário

votos
2

você pode fazê-lo como um subselect, algo como

select * from (
    SELECT A,B,C FROM table WHERE field LIKE 'query%'
    UNION
    SELECT A,B,C FROM table WHERE field LIKE '%query'
    UNION
    SELECT A,B,C FROM table WHERE field LIKE '%query%'
) ORDER BY B ASC LIMIT 5
Respondeu 06/08/2008 em 19:54
fonte usuário

votos
1

SELECT a distinta, b, c de (SELECT A, B, C, 1 como o FROM tabela ONDE campo como 'consulta%' UNION SELECT A, B, C, 2 como o FROM tabela ONDE campo COMO '% consulta' SELECT UNION A, B, C, 3 como o dE ONDE tabela campo cOMO '% consulta%') ORDEM por O ASC LIMITE 5

Seria a minha maneira de fazê-lo. Eu não sei como que as escalas.

Eu não entendo o

GROUP BY B ORDER BY B ASC LIMIT 5

Aplica-se apenas a este último SELECT na união?

O MySQL realmente permitem que você agrupe por uma coluna e ainda não agregados nas outras colunas?

EDIT: aaahh. Vejo que mysql realmente faz. É uma versão especial do DISTINCT (b) ou algo assim. Eu não gostaria de tentar ser um especialista nessa área :)

Respondeu 06/08/2008 em 20:41
fonte usuário

votos
0

Há dois varients de UNION.

'UNION' and 'UNION ALL'

Na maioria dos casos, o que você realmente quer dizer é UNION ALL, pois não fazem eliminação duplicada (Pense SELECT DISTINCT) entre as séries que pode resultar em um pouco de poupança em termos de tempo de execução.

Outros sugeriram vários conjuntos de resultados que é uma solução viável no entanto gostaria de alertar contra isso em tempo aplicações sensíveis ou aplicativos conectados através de WANs pois isso pode resultar em um número significativamente maior de ida e volta no fio entre o servidor eo cliente.

Respondeu 17/09/2008 em 17:21
fonte usuário

votos
0

Eu finalmente (olhando para todas as sugestões) veio a esta solução, é um pouco de um compromisso entre o que eu preciso e tempo.

SELECT * FROM 
  (SELECT A, B, C, "1" FROM table WHERE B LIKE 'query%' LIMIT 3
   UNION
   SELECT A, B, C, "2" FROM table WHERE B LIKE '%query%' LIMIT 5)
AS RS
GROUP BY B
ORDER BY 1 DESC

ele oferece 5 resultados totais, tipos de quarto "coluna" e me dá o que eu preciso; um conjunto natural, resultado (sua vinda sobre AJAX), e um conjunto de resultados curinga seguinte logo após.

:)

/ pf

Respondeu 06/08/2008 em 20:19
fonte usuário

votos
0

Se não houver uma espécie que faz sentido para pedir-lhes que você deseja, não união os resultados juntos - apenas retornar 3 registros separados, e lidar com eles nesse sentido na sua camada de dados.

Respondeu 06/08/2008 em 19:54
fonte usuário

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more