SQLの初心者として、私は単純なタスクを実行するのは大丈夫ですが、今は複数のネストされたクエリで苦労しています。ネストされたクエリと結合
Case
テーブル:
id nd date username
--------------------------------------------
1 596 2016-02-09 16:50:03 UserA
2 967 2015-10-09 21:12:23 UserB
3 967 2015-10-09 22:35:40 UserA
4 967 2015-10-09 23:50:31 UserB
5 580 2017-02-09 10:19:43 UserA
Value
テーブル:
case_id labelValue_id Value Type
-------------------------------------------------
1 3633 2731858342 X
1 124 ["864","862"] X
1 8981 -2.103 X
1 27 443 X
... ... ... ...
2 7890 232478 X
2 765 0.2334 X
... ... ... ...
とLabel
テーブル:
id label
----------------------
3633 Value of W
124 Value of X
8981 Value of Y
27 Value of Z
私の問題は、私はこのような3つのテーブルを持っているということです明らかに、私はこれらのtablに参加したいes。だから私はこのような何かをすることができます:
SELECT *
from Case, Value, Label
where Case.id= Value.case_id
and Label.id = Value.labelValue_id
私はより具体的にしたいのですが、私はほとんどすべてを取得します。私が欲しいもの
はCase
テーブルの上にいくつかのフィルタリングを行うと、他の2つのテーブルを結合したIDを使用することです。私はしたいと思います。同じNDのserveralのインスタンスがある場合、最も古いものを取るよう
- フィルター
Case.nd
年代、 - リミットクエリでNDの数。たとえば、2,3,4などのテーブルに参加することができます。
Value
とLabel
テーブルに参加するには、このクエリを使用します。
例えば、問合せ1と2の出力は次のようになります。私は2つの異なるNDを求める場合
id nd date username
--------------------------------------------
1 596 2016-02-09 16:50:03 UserA
2 967 2015-10-09 21:12:23 UserB
。 nd 967は数回現れますが、私たちは最も古いものを取ります。実際に
、私はこれらすべてのことを行う方法を見つけたと思うが、私は/それらをマージする方法がわからないことはできません。最古のNDを選択するには
、私は次のようにいろいろ書い操作を行うことができます。出力中のNdの数を制限するために、次に
select min((date)), nd,id
from Case
group by nd
select *,
@num := if(@type <> t.nd, @num + 1, 1) as row_number,
@type := t.nd as dummy
from(
select min((date)), nd,id
from Case
group by nd
) as t
group by t.nd
having row_number <= 2 -- number of output
それは動作しますが、私はそれが遅くなっていると感じています。最後に
、私は、処理は永遠にいっている。このサブクエリとし、他の二つのテーブルを結合するようにしよう。
私の研究では、問題のすべての部分について答えを見つけることができましたが、私はそれらをマージすることはできません。また、「カウント」問題では、ndの数を制限する必要があるので、それは遠いものだと感じています。
私はこれが長い質問であることを認識していますが、私は何かが恋しいと思うので、できるだけ詳しく説明したいと思います。
基本的な本やチュートリアルから始めます。特にJOINを見てください。 – Strawberry