2012-03-14 58 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