2012-03-14 53 views
0

我已经三代表 'HARDWARE_MODEL', '仓库' 和 '品牌' 和表格都以这种方式refernced在一起: HARDWARE_MODEL < - >仓库 HARDWARE_MODEL < - >品牌Mysql的复杂的SELECT

现在我想执行以下查询:选择'brand_id等于'10'的所有'仓库'对象)。非课程仓库和品牌不加入,因此它们之间不存在外键。我正在尝试类似于:

SELECT * 
FROM warehouses 
where hardware_id = (SELECT * 
        FROM hardwares 
        where brand_id='10') 

但它不起作用! 其中,hardware_id是“仓库表”字段,brand_id是“硬件表”字段。 有什么建议吗?

回答

1

这听起来像一个简单的多表连接。你只需要做一些事情(我只能猜测表结构)。

SELECT w.* FROM warehouses w 
JOIN hardwares h ON w.hardware_id = h.hardware_id 
JOIN brands b ON h.brand_id = b.brand_id 
WHERE brand_id=10; 
+0

确定我'已经解决了基于你的例子现在它的工作原理: – Marco 2012-03-14 18:20:52

0

它不起作用,因为您的子查询返回多个列,并可能多于一行。你应该能够用JOIN做到这一点:

SELECT * 
FROM warehouses 
JOIN hardwares ON warehouses.hardware_id = hardwares.id 
WHERE brand_id = '10' 

hardwares.id应该与任何键warehouses.hardware_id引用来代替。即使您没有指定FOREIGN KEY约束,您仍然可以连接表。

0

Surpriased并不在一个大的堆摔倒应该是这样的

SELECT * FROM warehouses 
where hardware_id in (SELECT hardware_id FROM hardwares where brand_id='10') 
+0

MySQL不能优化这样的子选择,所以'JOIN'更能体现最佳运行的机会。我想你的意思是'hardware_id IN(SELECT ...'也是 – 2012-03-14 18:04:46

+0

正确的,并相应地修改。我更喜欢自己的连接,但我想指出在选择*从来没有工作... – 2012-03-15 14:37:29

0

只是猜测在你的表,但也许

SELECT w1.* 
FROM warehouses w1, 
    hardware h1 
where w1.hardware_id = h1.hardware_id 
and h1.brand_id=10 

你有没有在你的仓库表hardware_id?如果没有,你在哪里做仓库和它之间的关系?

+0

是的,我已经如我已经陈述hardware_id是在我的仓库表 – Marco 2012-03-14 18:17:33