문제

다음 쿼리를 시도 중입니다.

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

그것은 세 가지 쿼리가 서로 붙어 있는 것입니다.그러나 반환되는 결과 집합에는 바람직하지 않은 쿼리 #1의 결과 이전에 쿼리 #3의 결과가 반영됩니다.

쿼리 #1에 대한 결과가 모두 나온 다음 쿼리 #2에 대한 결과가 모두 나온 다음 쿼리 #3에 대한 결과가 모두 나오도록 우선순위를 지정할 수 있는 방법이 있습니까?아직은 PHP에서 이 작업을 수행하고 싶지 않습니다(첫 번째 쿼리에 표시된 결과를 두 번째 쿼리에는 표시하지 않도록 제어해야 한다는 것은 말할 것도 없고).

도움이 되었습니까?

해결책

아마도 네 번째 열을 포함시켜 해당 열이 나온 테이블을 명시한 다음 이를 기준으로 정렬하고 그룹화해야 할 수도 있습니다.

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

다른 팁

다음과 같이 전체 결과 집합을 정렬하는 데 사용할 하드 코딩된 값이 포함된 추가 열을 추가합니다.

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

다음과 같이 하위 선택으로 수행할 수 있습니까?

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

Select A, B, C from ( 'Query%'Union과 같은 필드에서 O, B, C, 1을 선택하여 '%query'Union Select 필드에서 O에서 O, B, C, 2를 선택하십시오. a, b, c, 3 '%query%'와 같은 필드가있는 테이블에서 o as o as o asc asc limit 5

내 방식이겠지.나는 그것이 어떻게 확장되는지 모른다.

나는 이해하지 못한다

GROUP BY B ORDER BY B ASC LIMIT 5

Union의 마지막 SELECT에만 적용됩니까?

mysql에서는 실제로 열별로 그룹화할 수 있지만 다른 열에서는 집계를 수행할 수 없습니까?

편집하다:아아아.나는 mysql이 실제로 그렇게 한다는 것을 알았다.DISTINCT(b) 등의 특수 버전입니다.나는 그 분야의 전문가가 되려고 노력하고 싶지 않습니다 :)

원하는 순서대로 정렬하는 것이 타당하지 않은 경우 결과를 통합하지 마세요. 3개의 별도 레코드 세트를 반환하고 데이터 계층에서 그에 따라 처리하면 됩니다.

나는 결국 (모든 제안을 보면서) 내가 필요한 것과 시간 사이의 약간의 절충안인 이 솔루션에 도달했습니다.

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

총 5개의 결과를 제공하고 네 번째 "열"에서 정렬하여 필요한 것을 제공합니다.자연스러운 결과 세트(AJAX를 통해 제공됨)와 바로 뒤에 나오는 와일드카드 결과 세트입니다.

:)

/mp

UNION에는 두 가지 변형이 있습니다.

'UNION' and 'UNION ALL'

대부분의 경우 실제로 말하고 싶은 것은 중복 제거를 수행하지 않는 UNION ALL입니다(생각해 보세요). SELECT DISTINCT) 실행 시간 측면에서 상당한 절약 효과를 가져올 수 있는 세트 간.

다른 사람들은 실행 가능한 솔루션인 여러 결과 집합을 제안했지만 시간에 민감한 응용 프로그램이나 WAN을 통해 연결된 응용 프로그램에서는 이에 주의해야 합니다. 그렇게 하면 서버와 클라이언트 간의 회선에서 훨씬 더 많은 왕복이 발생할 수 있기 때문입니다.

단일 테이블에서 데이터를 가져오기 위해 왜 Union이 필요한지 이해가 안 됩니다. SELECT A ,B ,C FROM table WHERE field LIKE 'query%' or field LIKE '%query' or field LIKE '%query%' GROUP BY B ORDER BY B ASC LIMIT 5

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top