2015-12-12 67 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