2015-12-12 102 views
0

這是我的數據庫架構如何創建查詢,以避免「子查詢返回多個1行的」

enter image description here

我需要查看從TAB3值與以sortId和id從TAB2。所以我創建查詢:

SELECT * FROM test.tab3 where idTab2 = 1 and sortId = 1; 

它沒關係。

現在我有一個任務:來自tab1的id並顯示來自tab3的值。由於TAB1和標籤2有關係一對多,我做這樣的事情:

SELECT * FROM test.tab3 where idTab2 = (select id from test.tab2 where idTab1 = 1); 

,但我預計錯誤: enter image description here

現在是我的問題。如何創建查詢或也許做其他事情像這個僞創造的東西:

ids = select id from test.tab2 where idTab1 = 1 select * from tab.test3 where idTab2 = ids[0] and ids 1

回答

2

使用它作爲:

SELECT * FROM test.tab3 where idTab2 IN (select id from test.tab2 where idTab1 = 1); 

瞭解MySQL的IN子句see it

+0

我thnik的這是我的最佳解決方案。我想過,謝謝+1 – Adamo

1

當使用MySQL中,你可以使用(子)查詢結尾處的LIMIT子句。這會將結果集限制爲給定的數字。不過要小心。由於在您的案例中選擇第一個結果時可能沒有明確的結果順序,因此結果不是確定性的。

+0

感謝您的提示 – Adamo

2

如果子選擇可以返回多行,使用EXISTS代替:

SELECT * 
FROM test.tab3 t3 
WHERE EXISTS (
    SELECT * 
    FROM test.tab2 t2 
    WHERE t2.idTab1 = 1 AND t3.idTab2 = t2.id 
) --     ^^^^^^^^^^^^^^^^^^^^^ 

idTab2 = SELECT id ...比較已經進入嵌套SELECTWHERE條款。

+0

是的,好主意。謝謝+1 – Adamo

2

如果我理解的很好,你想獲得tab3中與tab1相關的所有行到tab2,不是嗎?然後,你需要一個三個表之間的連接

SELECT tab3.* FROM tab3 
    INNER JOIN tab2 ON tab3.idTab2=tab2.id 
    INNER JOIN tab1 ON tab2.idTab1=tab1.id 
WHERE tab1.id=<your parameter>; 

如果您不需要比id其他TAB1訪問任何列,你可以讓tab1 APPART的加入:

SELECT tab3.* FROM tab3 
    INNER JOIN tab2 ON tab3.idTab2=tab2.id 
WHERE tab2.idTab1=<your parameter>; 
+0

是的,好主意。感謝+1 – Adamo