2010-02-18 96 views
2

說我有3個表。表1包含client_id和client_name。表2包含client_id,client_catid_1和client_catid_2。這些表根據client_id進行連接。現在第三個表包含category_id和category_name。如何根據類別ID加入第三個表並獲取category_name?例如:3表加入MySQL

表1:

client_id | client_name 
----------------------- 
121231231 | Some name 
345234666 | Another Name 
----------------------- 

表2:

client_id | client_catid_1 | client_catid_2 
------------------------------------------- 
121231231 | 22    | 79 
345234666 | 34    | 566 
------------------------------------------ 

表3:

category_id | category_name 
---------------------------- 
22   | category 22 
34   | category 34 
79   | category 79 
566   | category 566 
---------------------------- 

然後輸出:

client_id | client_name | client_cat1 | client_cat2 
--------------------------------------------------- 
121231231 | Some name | category 22 | category 79 
345234666 | Another  | category 34 | category 566 
--------------------------------------------------- 

而當前查詢:

SELECT client.*, 
cat1id.client_catid_1 as cat1, 
cat2id.client_catid_2 as cat2 
FROM tb_clients AS client 
LEFT JOIN tb_clients_categories cat1id ON client.client_id = cat1id.client_id 
LEFT JOIN tb_clients_categories cat2id ON client.client_id = cat2id.client_id 
WHERE client.client_id = 65447 

另外,我不是問數據庫標準化和設計。我只是這樣說的,因爲人們往往會錯過你的問題,並開始試圖告訴你更好的數據庫設計。我明白這一點。我正在處理一些我原本沒有放在一起的東西,並且改變數據庫不是一種選擇!

在此先感謝!

回答

5

用途:

SELECT a.client_id, 
      a.client_name, 
      c1.category_name AS client_cat1, 
      c2.category_name AS client_cat2 
    FROM tb_clients a 
LEFT JOIN tb_clients_categories b ON b.client_id = a.client_id 
LEFT JOIN TABLE C c1 ON c1.category_id = b.client_catid_1 
LEFT JOIN TABLE C c2 ON c2.category_id = b.client_catid_2 
    WHERE c1.category_name = 'Something' 
     -- because you can't refer to a column (client_cat1) alias in the WHERE 

這會給你的客戶名單,以及可選的類別名稱。如果tb_clients_categoriestb_clients之間的關係不存在,客戶端名稱將仍然出現,並且client_cat1client_cat2將爲空。如果您不想要,請刪除JOIN上的LEFT關鍵字,以便只有兩個類別關聯的客戶端出現在輸出中。

+0

這是完美的,但一個問題...是否可以說:WHERE client_cat1 =「東西」? – mike 2010-02-18 16:31:14

+0

@mike:靠你的命令! :) – 2010-02-18 16:36:16

+0

完美!那是什麼讓我難住。我不斷收到「未知專欄」。謝謝! – mike 2010-02-18 16:40:14

1
SELECT client.*, 
cat1id.client_catid_1 as cat1, 
cat1id.client_catid_2 as cat2, 
cat1.category_name, 
cat2.category_name 
FROM tb_clients AS client 
LEFT JOIN tb_clients_categories cat1id ON client.client_id = cat1id.client_id 
LEFT JOIN category cat1 ON category.cat_id = cat1id.client_catid_1 
LEFT JOIN category cat2 ON category.cat_id = cat2id.client_catid_2 
WHERE client.client_id = 65447 
0

A LEFT JOIN語句可以包含任何過濾器。使用join子句中OR,你不需要再重複第一個表:

SELECT client.*, 
    cats.category_id AS client_catid 
FROM tb_clients AS client 
    LEFT JOIN tb_clients_categories cat1id ON client.client_id = cat1id.client_id 
    LEFT JOIN tb_categories cats ON 
    (cats.category_id = cat1id.client_cat1 OR 
    cats.category_id = cat1id.client_cat2) 
WHERE client.client_id = 65447 
+0

如果兩個類別都存在,這將每個'client_id'返回兩行。 – 2010-02-18 15:53:52