2013-07-24 196 views
0

也許我的失敗並不知道術語,但我期待着在另一個表作爲外鍵的兩個表上執行JOIN左側加入外鍵

因此,對錶格中的項目的ID被用來從表B,這是用來從表C.

TABLE A 
+----+------------+ 
| id | name  | 
+----+------------+ 
| 1 | comment | 
+----+------------+ 
TABLE B 
+-----------+------------------+ 
| object_id | cat_id_ref  | 
+-----------+------------------+ 
|   1 |    2 | 
+-----------+------------------+ 
|   1 |    3 | 
+-----------+------------------+ 
TABLE C 
+---------+----------+ 
| cat_id | cat_type | 
+---------+----------+ 
|  1 | Mean  | 
|  2 | Nice  | 
|  3 | Rude  | 
+---------+----------+ 

得到的文字表述所以現在的問題是2部分的外鍵。什麼是1步走外鍵查找稱爲術語,對於MySQL是這個子查詢?對於這種類型的JOIN

最佳實踐期望的結果將是:

+----+------------+------------+ 
| id | name  | cat_type | 
+----+------------+------------+ 
| 1 | veg 1  | Nice  | 
+----+------------+------------+ 
| 1 | veg 1  | Rude  | 
+----+------------+------------+ 
+0

改變了代碼,使其更清晰 – roberthuttinger

回答

1

這看起來像一個多對多的關係。我將TABLE B稱爲「關聯」表(或者有時候稱爲「關係」表,在某些情況下,這可以稱爲「成員資格」表)。

從數據庫設計的角度來看,我們要做「實體關係建模「。一個「實體」是一個人物,地點,事物,概念或事件,可以唯一標識,對商業感興趣,我們可以存儲有關信息。我們在這些實體之間有「關係」。當我們確定了一個關係時,我們會問正確的問題,找出一個實體中有多少與另一個實體有關。

在您的例子,它看起來像B實現的關聯,實體A和C.

  • 的「A」可以與零個,一個或多個「C」之間。
  • 「C」可以與零,一個或多個「A」相關。

(這是有一個合適的名稱來標識一個實體可以使模型更容易理解。)

要解決許多一對多,我們實現了第三個表,我們可以說出「 A_C「或」C_A「,或者它可以有完全不同的名稱。 (例如,「委員會」和「人員」之間的聯繫可能被稱爲「會員」)。

新表,在你的榜樣,命名爲 「B」

  • A 「B」 有關,只有一個 「A」
  • A 「B」 有關,只有一個 「C」
  • 的「A」是與零個,一個或多個「B」
  • A「C」是與零個,一個或多個「B」

引進「B」表做出決議的多對多的關係將其融入兩個「一對多」關係。 (看起來您已經瞭解外鍵在關係的「多」一側如何表上,以及如何引用實體表的主鍵(或唯一鍵)) 「一」的關係方面:外鍵的值是從其他表的主鍵值的副本)


關於你問題的第二部分,這裏是一個查詢的例子。那將返回指定的結果集:

SELECT a.id 
    , a.name 
    , c.veg_type 
    FROM A a 
    LEFT 
    JOIN B b 
    ON b.object_id = a.id 
    LEFT 
    JOIN C c 
    ON c.veg_id = b.veg_type_ref 

(有dif不同的查詢將返回相同的結果集;在處理「缺失」的行方面存在很大差異(例如,表A中表B中沒有「匹配」行的行。其他差異是性能,這取決於基數,選擇性,可用索引,等等)

這些都是JOIN;不需要引入子查詢來獲取指定的結果集。

+0

,這正是我需要的教育和指針的一點點。我可以看到有幾種方法可以解決這個問題。我以前從來不需要使用'關係'表! – roberthuttinger

+1

@roberthuttinger:在「理想」設計中,每個表格代表一個實體,或兩個實體之間的關聯。有時候,實施的模型並不理想。但是理想的模型確實使SQL很容易放在一起,如果我們理解模型並理解SQL中可用的操作。 「從理論上講,理論和實踐沒有區別,實際上存在。」 – spencer7593

+0

感謝您的澄清!這對其他人也是一個很好的資源 – roberthuttinger

1

這聽起來像你正在尋找這樣的事情。

select A.*, C.veg_type 
from A 
inner join B 
     on A.id = B.object_id 
inner join C 
     on C.veg_id = B.veg_id_ref 
1

基本上只是一個 - 到 - 多關係

可以一蔬菜比1型多?這個例子看起來太簡單了,不需要中間表。

select id,name, veg_type 
from TableA 
inner join TableB on Tablea.id = tableb.object_id 
inner join TableC on tableb.veg_id_ref = tablec.id 
+0

是的,'veg 1'可以有幾種類型(數據提供不是最好的例子)編輯OP反映 – roberthuttinger