2014-10-20 73 views
1

我有一個非常糟糕的表結構的舊數據庫,我試圖用更好的結構創建這些表。爲此,我需要匹配兩個表,以獲取類別的ID。SQL與多個值的左連接

這裏是我的兩個舊錶:

表的categorys:

| ID | catname  | cat1 | cat2  | cat3 | cat4 | 
+----+--------------+--------+-------------+---------+------+ 
| 1 | bike  | bike | NULL  | NULL | NULL | 
| 2 | accessories | bike | accessories | NULL | NULL | 
| 3 | helmets  | bike | accessories | helmets | NULL | 
| 4 | lights  | bike | accessories | lights | NULL | 
| 5 | led   | bike | accessories | lights | led | 

表產品:我想擺脫列CAT1,2

| ID | productnr | productname | cat1 | cat2  | cat3 | cat4 | 
+----+-------------+---------------+-------+-------------+---------+------+ 
| 1 | 451157  | productya | bike | accessories | NULL | NULL | 
| 2 | 555523  | product11 | bike | accessories | helmets | NULL | 
| 3 | 234432  | helmetxqa | bike | accessories | helmets | NULL | 
| 4 | 666623  | lightblue | bike | accessories | lights | NULL | 
| 5 | 542123  | foobarlight | bike | accessories | lights | led | 

起初, 3和4來自產品表。

所以,我得到這樣一個結果:

| ID | catId | productnr | productname | 
+----+---------+------------+---------------+ 
| 1 | 2  | 451157  | productya | 
| 2 | 3  | 555523  | product11 | 
| 3 | 3  | 234432  | helmetxqa | 
| 4 | 4  | 666623  | lightblue | 
| 5 | 5  | 542123  | foobarlight | 

能有人告訴我,我應該如何進行查詢,檢查是否所有4貓的是匹配的,然後給的我cat'id?我試過這種方式,但我認爲這是錯誤的方式,因爲每次產品只有2或3只貓,我沒有得到相關的catId。所以它只適用於所有4只貓定義的產品。

SELECT 
    cat.`id`, 
    prod.`productnr`, 
    prod.`productname` 
FROM 
    products as prod 
LEFT JOIN 
    categorys as cat 
ON 
    cat.`cat1` = prod.`cat1` 
AND 
    cat.`cat2` = prod.`cat2` 
AND 
    cat.`cat3` = prod.`cat3` 
AND 
    cat.`cat4` = prod.`cat4` 

如果有人對我也有用tipps,請告訴我。 ;-)

感謝您幫助我:)

+0

你想要什麼? – carexcer 2014-10-20 21:21:35

+0

您的空單元格是否爲空或''? – 2014-10-20 21:22:04

+0

我改變了我的示例表。空單元格爲NULL! – emjay 2014-10-20 21:30:02

回答

3

可以接近這個通過爲每個類別組合分別進行連接。當然,這是一個層次排名,你不想重複。因此,下面做這些檢查:

SELECT prod.id, coalesce(c4.id, c3.id, c2.id, c1.id) as catid 
     prod.`productnr`, prod.`productname` 
FROM products prod left join 
    categorys c4 
    on c4.cat1 = prod.cat1 and c4.cat2 = prod.cat2 and 
     c4.cat3 = prod.cat3 and c4.cat4 = prod.cat4 left join 
    categorys c3 
    on c3.cat1 = prod.cat1 and c3.cat2 = prod.cat2 and 
     c3.cat3 = prod.cat3 and c3.cat4 is null and 
     c4.id is null left join 
    categorys c2 
    on c2.cat1 = prod.cat1 and c2.cat2 = prod.cat2 and c2.cat3 is null and 
     c3.id is null and c4.id is null left join 
    categorys c1 
    on c1.cat1 = prod.cat1 and c1.cat2 is null and 
     c2.id is null and c3.id is null and c4.id is null; 

這是可能的,這將在某些情況下產生重複的行(雖然它的工作原理,以避免這種情況)。如果發生這種情況,那麼group by可能仍然是必要的。

+0

的cat1,cat2,cat3,cat4的組合,這是按照描述的方式工作的。 :)沒有重複的行,所以這就是我想要的。 :)謝謝,現在我可以創建更好的表格。 :) – emjay 2014-10-20 21:44:32

+0

你能告訴我爲什麼你檢查「c4.id爲空」,「c3.id爲空」等等?爲什麼列ID? – emjay 2014-10-20 21:47:05

+0

@ernjay。 。 。我試圖避免產品2匹配類別1,2和3。 – 2014-10-20 21:54:02

1

首先,您需要正確的數據模型。

分類:

| ID | catname  | 
+----+--------------+ 

產品:

| ID | productnr | productname | 
+----+-------------+---------------+ 

而且是如此的神奇結表:

|ID | product_id | category_id| 
+---+------------+------------+ 

現在可以正確地問你的數據庫,爲您提供數據

SELECT 
    cat.`id`, 
    prod.`productnr`, 
    prod.`productname` 

FROM categories as cat 

INNER JOIN products2categories p2c 
ON p2c.category_id = cat.id 

INNER JOIN products prod 
ON p2c.product_id = prod.id 

因爲我真的不喜歡發放完整的複製粘貼示例,所以我會讓您使用上面的查詢來查看如何找到存在於4個類別中的產品。請記住 - 最簡單的方法通常總是正確的方法。

+0

非常感謝您的回答。 :)問題是,我試圖從結果中建立新表,因爲舊錶有1000個條目。所以不可能創建新的表格。我需要用結果創建數據。 (我正在用PHP做)。通過輸出,我將爲每個產品創建一個新的INSERT。你懂我的意思嗎?也許你可以給我一個提示,爲什麼我的SQL查詢只是處理所有貓定義的產品。匹配不適用於空貓。非常感謝! – emjay 2014-10-20 21:26:53

0

如果您只想在每個cat字段加入時獲得id s,請嘗試使用INNER JOIN而不是LEFT JOIN

SELECT 
    cat.`id`, 
    prod.`productnr`, 
    prod.`productname` 
FROM 
    products as prod 
INNER JOIN 
    categorys as cat 
ON 
    cat.`cat1` = prod.`cat1` 
AND 
    cat.`cat2` = prod.`cat2` 
AND 
    cat.`cat3` = prod.`cat3` 
AND 
    cat.`cat4` = prod.`cat4` 
+0

與此查詢我的結果只有大約500行,但產品表有大約1000個entrys。 – emjay 2014-10-20 21:30:40

1

的問題很可能在你的桌子空,因爲空!= NULL在SQL

來繞去這個問題,你可以合併數據

SELECT 
    cat.`id`, 
    prod.`productnr`, 
    prod.`productname` 
FROM 
    products as prod 
LEFT JOIN 
    categorys as cat 
ON 
    coalesce(cat.`cat1`,'No Value') = coalesce(prod.`cat1`,'No Value') 
AND 
    coalesce(cat.`cat2`,'No Value') = coalesce(prod.`cat2`,'No Value') 
AND 
    coalesce(cat.`cat3`,'No Value') = coalesce(prod.`cat3`,'No Value') 
AND 
    coalesce(cat.`cat4`,'No Value') = coalesce(prod.`cat4`,'No Value') 
+0

這將返回重複的行。 – 2014-10-20 21:30:49

+0

這不能正常工作。由於我的產品表具有產品,因此我得到的結果數量完全相同,但結果中有一些行沒有產品編號。他們是「零」。 – emjay 2014-10-20 21:33:31

+0

您的分類表是否定義了產品表中的所有分類? – 2014-10-20 21:34:28