0

これは複雑な問題のように思えますが、アイデアを明確にし、シナリオを説明するために最善を尽くします。基本的に、2 つのテーブルを結合して、1 つのクエリの結果セットとして返す必要があります。1 つのテーブルを特定の順序で別のテーブルにマージする必要があります。

テーブル 1 をArticles、テーブル 2 をFeaturesとします。両方のテーブルには、一意の番号を持つIDフィールドがあります。Articlesには、最初にレコードを降順でソートするために使用される日付フィールドがあります。Featuresテーブルには、最初にレコードをソートするために使用されるDeltaフィールドがあります。Featuresテーブルの一部のレコードはプレースホルダーであり、最終的なセットに含めることを意図していません。それらの唯一の目的は、並べ替え順序に影響を与えることです。各レコードのDeltaフィールドには、これらのレコードの並べ替えに使用される 1 ~ X の一意の値があります。Skipという別のフィールドの値は1です。2 つのテーブルをマージするときに削除する必要がある場合。ここでも、スキップされたレコードの唯一の目的は、 Featuresテーブルでの最初の並べ替え中にスペースを占有することです。それらは不要ですが、存在し、削除することはできません。

注意が必要なのは、両方のテーブルの結果をマージするときに、Features テーブルのスキップされていないレコードを、Featuresテーブルに表示される順序でArticlesテーブルの結果に挿入する必要があることです。

したがって、Featuresテーブルに A ~ F の 6 つのレコードがあり、order フィールドの範囲が 1 ~ 6 であるとします。レコード A、B、D、E のSkipフィールドの値はすべて 1です。つまり、レコード C と F のみに関心があることを意味します。どちらも最終レコード セットの 3 番目と 6 番目にそれぞれ挿入する必要があります。

Articlesテーブルの場合、レコードは次のようになります。

+----+------------+
| id |    date    | 
+----+------------+
| 1  | 9999999999 |
+----+------------+
| 2  | 9999999998 |
+----+------------+
| 3  | 9999999997 |
+----+------------+
| 4  | 9999999996 |
+----+------------+
| 5  | 9999999995 |
+----+------------+
| 6  | 9999999994 |
+----+------------+
| 7  | 9999999993 |
+----+------------+
| 8  | 9999999992 |
+----+------------+
| 9  | 9999999991 |
+----+------------+
| 10 | 9999999990 |
+----+------------+

Featuresテーブルは次のようになります。

+----+------+-------+------+
| id | name | delta | skip |
+----+------+-------+------+
| 11 |   A  |   1   |   1  |
+----+------+-------+------+
| 12 |   B  |   2   |   1  |
+----+------+-------+------+
| 13 |   C  |   3   |   0  |
+----+------+-------+------+
| 14 |   D  |   4   |   1  |
+----+------+-------+------+
| 15 |   E  |   5   |   1  |
+----+------+-------+------+
| 16 |   F  |   6   |   0  |
+----+------+-------+------+

結果は次のようになります (私の目標を達成するために必要な追加フィールドは含まれていません)。

+----+
| id |
+----+
| 1  |
+----+
| 2  |
+----+
| 13 | (record from the Features table in the third position)
+----+
| 3  |
+----+
| 4  |
+----+
| 16 | (record from the Features table in the sixth position)
+----+
| 5  |
+----+
| 6  |
+----+
| 7  |
+----+
| 8  |
+----+
| 9  |
+----+
| 10 |
+----+

私の説明が理にかなっていることを願っています。何か案は?

ありがとう、ハウィー

4

2 に答える 2

0

あなたの例には間違いがあると思います.record id=16 は Features テーブルの 6 行目なので、結果の前ではなく id=5 の後でなければなりません。

ブロークエリを試してください。これがSQLFiddleです。

select id from (
  select `date`, null delta, id
  from Articles
  union all
  select a.`date`, f.delta, f.id 
  from ( 
    select (@x:=@x+1) rn, a.*
    from Articles a, (select @x:=0) z
    order by a.`date` desc
  ) a
  join (
    select (@y:=@y+1) rn, f.id, f.delta, f.skip
    from Features f, (select @y:=0) z
    order by f.delta
  ) f
  on a.rn = f.rn
  where f.skip <> 1
  order by `date` desc, isnull( delta ), delta 
) merge
于 2013-07-29T19:31:54.963 に答える
0

SQL Fiddle のこの例のように見えます。

SELECT id, sort_order FROM (
SELECT `date`, NULL delta, id, (@a_count:=@a_count+1) sort_order
  FROM Articles a_main, (SELECT @a_count:=-1) z

  UNION ALL

SELECT a.`date`, f.delta, f.id, f.weighted_rn
  FROM (
    SELECT (@x:=@x+1) rn, a.*
    FROM Articles a, (SELECT @x:=-1) z
    ORDER BY a.`date` DESC
  ) a

JOIN (
    SELECT (@y:=@y+1) rn, TRUNCATE((f.delta - @y - (1/@y)),2) AS weighted_rn, f.id, f.delta, f.skip
    FROM Features f, (SELECT @y:=-1) z
    WHERE f.skip <> 1
    ORDER BY f.delta
  ) f

ON a.rn = f.rn
ORDER BY sort_order
) merge

フレームワークを提供してくれたKordirkoに感謝します。

于 2013-07-30T00:29:19.463 に答える