0

MySQL のビューのペアからの予約データがあります。これらは列と完全に一致します。主な違いは、これらの行のいずれかに配置される予約コードです。

コンテキストは次のとおりです。これは、スポーツ キャンプの数値を計算するためのものです。人々は予約されていますが、追加の活動を行うことができます。

ビュー 1: すべてのスペシャリストの予約 (例: フットボールのクラス)。

ビュー 2: 一般グループ。

ソフトウェアが古いため、予約プロセスで一般グループを予約する人が多くなり、その後、古いクラスにアップグレードされます。これは、ビジネスの他の部分でさらに複雑になります。

明確にするために、ビュー 1 には、実際にはビュー 2 内の一部 (すべてではない) の人々が含まれています。2 つのグループの共通部分があります。明らかに、人々が同時に 2 つのグループに属することはできません (グループは 1 つだけです!)。

もちろん、ビュー 2 にいるすべての人を見つけるのは簡単です... ビュー 1 と同様です。しかし、基本的に次のようなレポートを作成する必要があります。

  • 「View 1」が「View 2」を上書きする...または別の言い方をすると:
  • 「View 1」 [並べ替え] UNION 「View 2」

ただし、追加の複雑さがあるため、これを行う最善の方法はわかりません。

各行はおおよそ次のとおりです (他のものは省略されています)。

User ID Timeslot Activity
1          A     Football
1          A     General
2          A     General
3          A     Football

ご覧のとおり、これらの行はすべてタイムスロット A に関するものです。 - ユーザー 2 は一般的なアクティビティを行います。- ユーザー 3 はサッカーをします。- ユーザー 1 はサッカーと一般を行います。

これらの項目は一意ではないため、真に明確な行がないため、上記は UNION (個別) です。

必要な出力は次のとおりです。

User ID Timeslot Activity
1          A     Football
2          A     General
3          A     Football

ここでは、サッカーが「一般」よりも「優先」されているため、いつでも人々がどこにいるかを把握できます。

この UNION には、多くのフィールドに個別の節がありますが、他の節は無視されます。

だから:誰かが何をする方法を知っていますか:

  • 「2 つのテーブルを一緒に追加し、同じタイムスロットの場合はそのうちの 1 つを上書きします」

または次のようなもの:

  • 「UNION DISTINCT での選択的個別」。

乾杯リック

4

1 に答える 1

0

これを試して:

SELECT *
FROM
  (SELECT *,
          IF(Activity='General',1,0) AS order_column
   FROM `Table1`
   ORDER BY order_column) AS tmp
GROUP BY UserId

これによりorder_column1Activity 値がgeneral; これを行うと、この一時テーブルをこの列 (昇順) で並べ替えて選択でき、一般的なアクティビティを含むすべてのレコードが他のすべてのレコードの後に​​続きます。その後、この一時テーブルのグループ化の結果をユーザー ID で簡単に選択できます。集計関数を使用しない group by clouse は、一致する最初のレコードを取得します。

編集:集計関数なしでグループ化を使用しない場合、これは「醜い」代替手段です:

SELECT UserId,
       Timeslot,
       SUBSTRING(MAX(CASE Activity WHEN "General" THEN "00General" WHEN "Football" THEN "01Football" ELSE Activity END) , 3)
FROM `Table1`
GROUP BY UserId,
         Timeslot LIMIT 0 ,
                        30

ここで、 の可能な値をそれぞれ定義する必要がありますActivity

于 2013-04-15T10:46:05.713 に答える