2017-02-15 143 views
0

作爲SQL的初學者,我可以做簡單的任務,但我現在正在努力與多個嵌套查詢。 我的問題是,我有3個表是這樣的:嵌套查詢和加入

一個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 

顯然,我想加入這些桌面ES。所以,我可以做這樣的事情:

SELECT * 
from Case, Value, Label 
where Case.id= Value.case_id 
and Label.id = Value.labelValue_id 

,但我得到幾乎一切,而我想更具體。

我想要的是對Case表進行一些過濾,然後使用生成的ID來加入其他兩個表。我想:

  1. 濾波器Case.nd的這樣,如果有相同的Nd serveral的情況下,採取最古老的一個,
  2. 限次的查詢次數。例如,我希望能夠加入2,3,4等不同nd的表格。
  3. 使用此查詢可以對ValueLabel表進行聯接。

例如,查詢1和2的輸出將是:

id nd date     username 
-------------------------------------------- 
1 596 2016-02-09 16:50:03 UserA 
2 967 2015-10-09 21:12:23 UserB 

如果我要求2不同次。 nd 967出現好幾次,但我們拿最老的一個。

事實上,我想我已經找到了如何做所有這些事情,但我不知道如何合併它們。

要選擇最舊的第二,我可以做成纔等:

select min((date)), nd,id 
    from Case 
    group by nd 

然後,以限制輸出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

過濾情況表,以消除所有,但最古老的NDS,

select * from [case] c 
where date = (Select min(date) from case 
       where nd = c.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) 

將其限制在一定的數量的記錄,還有是一個特定於mysql的命令,我認爲它叫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 

如果你只是想記錄對於第二頂的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

謝謝你的回答,加入部分幫助我。然而,對於極限部分,我認爲還不夠清楚。我更新了帖子和「價值」表。對於與'Case.id'鏈接的'Case.nd',我可以在'Value'表中獲得5000個值。所以,我的觀點並不是要限制行的數量('限制4'允許我查看特定nd的前4個值),而是真正處理的nd數。我希望這會有道理。 – JoKa

+0

是的,我明白了,那麼你需要對案例表進行另一個謂詞限制....但是你必須指定*哪些* nd值包括然後...假設你想要*最高的* n值,我會檢查另一個解決方案 –

+0

謝謝!然而,我得到這個錯誤「錯誤代碼:1235.這個版本的MySQL還不支持'LIMIT&IN/ALL/ANY/SOME子查詢',我使用SQL V5.7.17,但顯然我們可以使用JOIN我正在研究它,我想我正在接近! – JoKa