2017-02-15 6 views
0

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のインスタンスがある場合、最も古いものを取るよう

  1. フィルターCase.nd年代、
  2. リミットクエリでNDの数。たとえば、2,3,4などのテーブルに参加することができます。
  3. ValueLabelテーブルに参加するには、このクエリを使用します。

例えば、問合せ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 

、私は(thisthatに基づいて)これを見つけた:

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の数を制限する必要があるので、それは遠いものだと感じています。

私はこれが長い質問であることを認識していますが、私は何かが恋しいと思うので、できるだけ詳しく説明したいと思います。

+0

基本的な本やチュートリアルから始めます。特にJOINを見てください。 – Strawberry

答えて

0

だから、最終的には、ここで私のためによく働いたものです:

select * 
from (
     select * 
     from Case 
     join (
      select nd as T_ND, date as T_date 
      from Case 
      where nd in (select distinct nd from Case) 
      group by T_ND Limit 5 -- <========= Limit of nd's 
     ) as t 
     on Case.nd = t.T_ND 
     where date = (select min(date) 
           from Case 
           where nd = t.T_ND) 
    ) as subquery 

    join Value 
     on Value.context_id = subquery.id 
    join Label 
     on Label.id = Value.labelValue_id 

感謝あなたは正しいトラックで私を導くための@charlesbretana :)。

0

select * from [case] c 
where date = (Select min(date) from case 
       where nd = c.nd) 

次いでちょうど他のテーブルにこれを参加、全てが、最も古いNDSを排除するために、ケーステーブルをフィルタリングする:が、レコードの特定の数に制限する

select * from [case] c 
    join value v on v.Case_id = c.Id 
    join label l on l.Id = v.labelValue_id 
where date = (Select min(date) from [case] 
       where nd = c.nd) 

MySQLの特定のコマンドですが、私はあなただけRECOをしたい場合、それはLimit

select * from [case] c 
    join value v on v.Case_id = c.Id 
    join label l on l.Id = v.labelValue_id 
where date = (Select min(date) from [case] 
       where nd = c.nd) 
Limit 4 -- <=== will limit return result set to 4 rows 

と呼ばれると思いますNDのトップN値についてRDS、その後、リミットはNDの値を取得するにはどのような制限サブクエリに行く:

select * from [case] c 
    join value v on v.Case_id = c.Id 
    join label l on l.Id = v.labelValue_id 
where date = (Select min(date) from [case] 
       where nd = c.nd) 
    and nd In (select distinct nd from [case] 
       order by nd desc Limit N) 
+0

ありがとうございました、私は助けてくれます。しかし、限界部分のために私は十分にはっきりしていないと思う。私はポストと 'Value'テーブルを更新します。 'Case.nd'が' Case.id'にリンクされている場合、 'Value'テーブルに5000の値を与えることができます。だから、私の指摘は、行の数を制限することではなく(「制限4」は特定のndの最初の4つの値を見ることができます)、実際には処理されるndの数です。それが意味をなされることを願っています。 – JoKa

+0

はい、私は理解していますが、ケーステーブルに別の述語の制限が必要です....しかし、あなたは* * * nの値を*とする必要があると仮定して*ソリューション –

+0

ありがとう!しかし、私はこのエラー "エラーコード:1235を取得します。このバージョンのMySQLはまだ 'LIMIT&IN/ALL/ANY/SOMEサブクエリ'をサポートしていません。私はそれに取り組んでいる、私は近づいていると思う! – JoKa

関連する問題