2

ユニオンを使用して 2 つのサブクエリを結合するクエリがあります。

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

このアプローチが生成する結果セットは、2 つのサブセットを順番に配置します (「ブログ」、「ニュース」)。

「ブログ」サブセットと「ニュース」サブセットの行を交互に並べて、2 つをインターリーブする結果セットを作成したいと考えています。

これを行う簡単な方法があるに違いないと感じていますが、見つけられませんでした。

どんな提案でも大歓迎です。

ニック

4

4 に答える 4

4

これは私にとって最も効果的なソリューションです。これは現在の提案のいずれとも同一ではないため、個別に追加しました。@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によるものであると信じてください。乾杯!

于 2012-09-05T15:13:04.433 に答える
2

さて、ここに私が考えることができる斬新な方法があります(テストされていませんが、要点はわかります):

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;

したがって、これは 2 つのクエリを実行してから、最初rowNumberに、次に で並べ替えqueryます。最終的には次のようなものになります。

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

SELECT @n=:0クエリのグローバル変数nを 0 にリセットしてから@n := @n + 1、各行の値をインクリメントします。

さらに説明が必要な場合はお知らせください。これがうまくいくことを願っています!:)

于 2012-09-05T08:56:27.193 に答える
2

試す

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

多分

于 2012-09-05T08:57:04.033 に答える
2

それは簡単です。次のように、サブクエリにパラメーター「ランク」を追加できます。

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

次に、次のようになります。

0, ...
2, ...

他のクエリで同じことを行い、ランクを 1 に初期化すると、次のようになります。

1, ...
3, ...

最後に「ORDER BY ランク」で、投稿とニュースが混在するようになります。

于 2012-09-05T08:59:00.430 に答える