2016-05-17 78 views
2

我正在運行MySQL 5.1.71。在我的數據庫中有三個表格 - 加載,黃銅和製造加載是我的「主」表。我的目標是查詢加載並在結果中包含mfg.name。我已經嘗試了JOIN子句和子查詢的各種迭代,這些子查詢都帶有和不帶有WHERE子句。看來這應該是相當微不足道的,所以我不知道我不能達到解決方案。SQL Join和Sub-query

load 
------------------------- 
| id | desc | brass_id | 
------------------------- 
| 1 | One |  2 | 
| 2 | Two |  1 | 
------------------------- 

brass 
--------------- 
| id | mfg_id | 
--------------- 
| 1 |  6 | 
| 2 |  8 | 
--------------- 

brass_mfg 
------------------------ 
| id | name   | 
------------------------ 
| 6 | This Company | 
| 8 | That Company | 
------------------------ 

我想要的結果會是...

results 
--------------------------- 
| load | mfg    | 
--------------------------- 
| One | That Company | 
| Two | This Company | 
--------------------------- 
  • 負載ID將永遠只有一個黃銅ID
  • 黃銅ID永遠只有一個MFG ID



ED IT
以前提供的樣品數據(上面)已更新。此外,下面是我正在運行的查詢和我得到的結果。該公司在每個返回的記錄中都是錯誤的。我在查詢和結果中包含了表中的ID。出現的公司名稱不是生產製造商表中的ID的名稱。

SELECT 
    load.id AS "load.id", 
    load.brass_id AS "load.brass_id", 
    brass.id AS "brass.id", 
    brass.mfg_id AS "brass.mfg_id", 
    brass_mfg.id AS "brass_mfg.id", 
    brass_mfg.name AS "brass_mfg.name" 
FROM `load` 
LEFT JOIN brass ON load.brass_id = brass.id 
LEFT JOIN brass_mfg ON brass.id = brass_mfg.id 


----------------------------------------------------------------------------------------- 
| load.id | load.brass_id | brass.id | brass.mfg_id | brass_mfg.id | brass_mfg.name  | 
----------------------------------------------------------------------------------------- 
| 1  | 2    | 2  | 6   | 2   | Wrong Company  | 
| 2  | 1    | 1  | 8   | 1   | Incorrect Company | 
----------------------------------------------------------------------------------------- 
+3

聯接是SQL查詢的基本構建塊。他們應該是你的第一選擇。要優化,請查看索引。 – MatBailie

+0

我真的在這裏看不到問題。 – Strawberry

+0

值得一提的是,您所期望的結果看起來像是假定每個'product'都有一個'mfg',但關聯表--''''通常用於多對多的關係中......請注意! – Darek

回答

2

看看你的表格,看看涉及到一個什麼樣的數據的另一個然後建立由表連接表來獲得所需輸出。

SELECT p.desc AS Product, m.name AS mfg 
FROM product p 
INNER JOIN lot l ON p.lot_id = l.id 
INNER JOIN mfg m ON l.mfg_id = m.id 
+0

問題是正確的連接類型和正確的左右表的組合。特別是你最後一次加入是讓我變得直截了當的。謝謝一堆。 – user1801810

0

您的聯接查詢中有錯誤。 試試這個:

Select 
l.id AS "load.id", 
l.brass_id AS "load.brass_id", 
b.id AS "brass.id", 
b.mfg_id AS "brass.mfg_id", 
m.id AS "brass_mfg.id", 
m.`name` AS "brass_mfg.name" 
FROM `load` as l 
LEFT JOIN brass as b ON l.brass_id = b.id 
LEFT JOIN brass_mfg as m ON b.mfg_id = m.id 

enter image description here

需要LEFT JOIN

+0

'LEFT JOIN'是我接近的最接近的,但是我收到了糟糕的結果。將其他信息放在一起編輯到原始文章中。 – user1801810

+0

我覺得'LEFT JOIN'是你設計的最好方法,如果你有一些不好的結果,你可能會把它們放在裏面,這樣我們可以幫你。 – wajeeh

+0

更新了原始文章以反映更多真實數據,增加了查詢和結果。 – user1801810

0

如果是單 - 單的關係,爲什麼有中間表? 在你的情況下,最好的情況是簡單的加入。

SELECT pt.desc as Product, mfg.name as Mfs 
FROM Product pt 
Join Lot lt on lt.id = pt.lot_id 
Join Mfg mf on mf.id = lt.mfg_id 
+0

給定的產品只有一個批次,因此只有一個製造商。但是,可能有多個產品指向同一批次。此外,每個表格中都有各種各樣的字段,這些字段必須將表格拆分爲它們。 – user1801810