2012-09-05 3 views
1

두 개의 하위 쿼리를 결합하는 데 공용체를 사용하는 쿼리가 있습니다.mySQL 두 테이블 교대 행의 결과 집합을 만듭니다.

SELECT * FROM posts WHERE postTypeId=1 (e.g. blog) 
UNION 
SELECT * FROM posts WHERE postTypeId=2 (e.g. news) 

이 접근법이 생성하는 결과 집합은 두 개의 하위 집합을 순차적으로 배치합니다 ("blog"다음 "news").

"blog"하위 집합과 "news"하위 집합의 행을 번갈아 바꾸는 결과 집합을 만들고 싶습니다.

나는 이것을 할 수있는 간단한 방법이 있어야한다고 느낍니다 만, 나는 그것을 찾지 못했습니다.

의견을 보내 주시면 대단히 감사하겠습니다.

+0

SQL의 임무는 데이터를 제공하는 것입니다. 특수한 방법으로 표시하는 것은 응용 프로그램의 작업입니다.쿼리를 간단하게 유지하고 응용 프로그램의 논리를 표시하십시오. 이것은 앱이 쓰여지는 언어에 관계없이 하나의 루프로 수행됩니다. –

+0

위의 쿼리는'SELECT * FROM posts WHERE postTypeId = 1 OR postTypeId = 2'로 작성 될 수 있습니다. 당신이 가지고있는 문제를 해결하려고 위와 같이 해보십시오. –

+0

@ThomasClayson, 예, 스 니펫은 분리 된 하위 세트를 가져 오는 것이 쉽지만 삽 입하는 것을 보여주기위한 것입니다. – NaNuk

답변

1

음, 여기에 내가 생각할 수있는 새로운 방법입니다 (테스트하지,하지만 당신은 요점을 얻을 것이다) :

SELECT * FROM (
    SELECT 1 AS query, @n := @n + 1 AS rowNumber, posts.* FROM (select @n:=0), posts WHERE posts.postTypeId=1 
    UNION 
    SELECT 2 AS query, @n := @n + 1 AS rowNumber, posts.* FROM (select @n:=0), posts WHERE posts.postTypeId=2 
) ORDER BY rowNumber, query; 

그래서이 두 개의 쿼리를 다음 순서를 할 것입니다 먼저 rowNumber 다음으로 query.

rowNumber | query 
1   | 1 
1   | 2 
2   | 1 
2   | 2 
etc... 

SELECT @n=:0 쿼리 0으로 전역 변수 n를 재설정하고 @n := @n + 1는 각 행의 값을 증가 : 당신이 될 겁니다 것은 같은 것이있다.

더 많은 설명이 필요하면 알려주세요. 이 작품 희망! 그런 다음을

SET @rank=0; 
SELECT @rank:[email protected]+2 AS rank FROM posts WHERE postTypeId=1 (e.g. blog) 

: :)

1

어쩌면 쉽게

1

, 당신은, 당신의 하위 쿼리에이 방법을 매개 변수 "순위"매개 변수를 추가 할 수 있습니다

Set @current_row = 0 
Select * From (
SELECT @current_row := @current_row + 1 as Position, posts.* FROM posts WHERE postTypeId=1 
UNION 
SELECT @current_row, posts.* FROM posts WHERE postTypeId=2 
) dummyTableName 
order by position, postTypeId 

시도 얻을 수 :

0, ... 
2, ... 

당신이 다른 쿼리에서 동일 할 수 있지만 1 순위를 initializating init을, 당신은 얻을 것이다 :

1, ... 
3, ... 

마지막으로 "순위 BY ORDER"당신은 혼합 게시물과 뉴스를 얻을 것이다.

2

이것은 나를 위해 가장 잘 작동하는 해결책입니다. 현재의 제안과 동일하지 않으므로 독자적으로 추가했습니다. @a, @b 및 @c는 하위 집합 당 행 번호를 만드는 데 사용됩니다. 즉, 결합 된 결과에서 3 개의 행은 동일한 행 번호 ("행 집합")를 공유합니다. 이것은 1 차 정렬로 사용되며 2 차 정렬은 "행 세트"내의 행을 정렬합니다.

SET @a = 0; 
SET @b = 0; 
SET @c = 0; 

SELECT * FROM(
    SELECT @a := @a + 1 AS sortOne, 1 AS sortTwo, posts.* FROM posts WHERE posts.postTypeId=3 
    UNION 
    SELECT @b := @b + 1 AS sortOne, 2 AS sortTwo, posts.* FROM posts WHERE posts.postTypeId=2 
    UNION 
    SELECT @c := @c + 1 AS sortOne, 3 AS sortTwo, posts.* FROM posts WHERE posts.postTypeId=1 
) AS result ORDER BY sortOne, sortTwo 

이 솔루션은 제출 된 솔루션에서 영감/파생,하지만 난 그것을 적절한 자체의 허용 솔루션 것으로 그 중 하나를 표시 할 수 있다고 생각하지 않습니다. 그래서 토마스 클레이슨, 토니 홉킨슨, 그리고 rmunoz가 크레디트를 얻었습니다. 건배!

관련 문제