-1

SQL で2 つの異なる日のデータを比較する必要があります。ページネーションで結果を使用する必要があるため、単一のクエリでそれが本当に必要です。問題は、自己結合を行うと、デカルト積であるため列が重複することです。INNER JOIN

SQLフィドルのコードは次のとおりです

例えば

SELECT * FROM `my_table` as t1 
INNER JOIN my_table t2 ON t1.quality = t2.quality
WHERE (
  t1.day = '2015-01-08' OR t1.day = '2015-01-09' OR 
  t2.day = '2015-01-08' OR t2.day = '2015-01-09'
)

2 つの質問:

  1. 品質の JOIN ごとに 1 つの行を取得するように書き直すにはどうすればよいですか?
  2. 対応する行 (品質に関する行) がいずれかの日から欠落している場合でも機能しますか?

編集

入力は次のとおりです。

INSERT INTO my_table
(quality, quantity, day)
VALUES
('A', 1, '2015-01-15'),
('B', 2, '2015-01-15'),
('B', 0, '2015-01-10');

そして、望ましい出力は次のとおりです。

QUALITY  | QUANTITY  | T1.QUANTITY - T2.QUANTITY
A           1          0 (or NULL?)
B           2          2

説明:

各日付には固有の値があります。したがって、A 品質と B 品質のみが表示されます。B については、別の日に適切な B がいます。Aの場合 - ありません。したがって、B の差は 2 (高い日付から低い日付を引いたもの) です。差し引くものがないため、A の差は 0 です。

4

1 に答える 1

1

重複した列を取得しているのは、T1 AND T2 からクエリを実行しているためです。したがって、明示的に T1.* のみを表示するように言わない限り、両方のテーブル エイリアス参照から列を取得します。

クエリは日付に対して OR を実行しているため、おそらくデカルトの結果も得られます。

これでテーブル構造がわかりましたが、次のような明示的なクエリを使用したほうがよい場合があります...

SELECT
      t1.day,
      t2.day as OtherDay,
      t1.quality,
      t1.anotherColumn,
      t2.OtherAnotherColumn,
      t1.thirdColumn,
      t2.OtherThirdColumn
   FROM 
      my_table t1
         join my_table t2
            on t1.quality = t2.quality
           AND t2.day = '2015-01-09'
   where
      t1.day = '2015-01-08' 

クエリを最適化するために、(日、品質) に基づいて "my_table" にインデックスを作成します。そして、day1 と day2 の間で比較しようとしている列をペアで追加し続けることができます。T1 は最初の日に関連付けられたもののみを返し、T2 エイリアスは 2 番目の日付の一致するエントリに対してのみ表示されます。

ここで、T1 側にのみエントリがあり、問題の品質と日付に対応する T2 エントリがないが、それでもそれらを表示したい場合は、JOIN を LEFT JOIN に変更します。

于 2015-01-15T15:47:00.407 に答える