2017-09-26 85 views
0

我有項的元數據的表wmeta:(有些項目已經丟失的數據)簡單的例子:MySQL的左外連接問題

id | item_id | meta_key | meta_value 
1 |100  |first_name |Joe 
2 |100  |last_name |Bloggs 
3 |100  |age   |21 
4 |101  |first_name |Fred 
5 |101  |last_name |Smith 
6 |102  |first_name |Jane 
7 |102  |last_name |Doe 
8 |102  |age   |22 

如果我有另一個表wfields與所有按鍵

id |meta_name 
1 |first_name 
2 |last_name 
3 |age 

使用下面的查詢我沒有得到我預計爲缺少的年齡記錄的空。

SELECT wf.meta_name, wm.item-id, wm.meta_value 
FROM wfields as wf 
LEFT JOIN wmeta as wm 
ON wf.meta_name = wm.meta_key 

我想輸出是一臺顯示器/導出爲CSV

100 | Joe Bloggs 22 
101 | Fred Smith '' 
102 | Jane Doe 21 
+0

如果您提供DDL查詢以用於類似http://sqlfiddle.com/ –

+2

的情況,則會更好。如果連接條件沒有匹配,則只會顯示null。有幾行'meta_key = age',所以條件滿足。 – Barmar

+0

@Battle_Slug,好的謝謝。我不知道這件事,但將來在 – ChrisH

回答

1

你只需要對錶格進行透視:

SELECT item_id, 
     MAX(IF(meta_key = 'first_name', meta_value, '')) AS first_name, 
     MAX(IF(meta_key = 'last_name', meta_value, '')) AS last_name, 
     MAX(IF(meta_key = 'age', meta_value + 0, NULL)) AS age 
FROM wmeta 
GROUP BY item_id 

如果您需要動態獲取的列,看到這裏的答案:MySQL pivot table

您也可以跨越第一個加入Meta鍵和物品ID的列表,然後左連接,與wmeta表:

SELECT x.item_id, x.meta_name, m.meta_value 
FROM (SELECT DISTINCT item_id, meta_name 
     FROM wmeta 
     CROSS JOIN wfields) AS x 
LEFT JOIN wmeta AS m 
ON m.item_id = x.item_id AND m.meta_key and x.meta_name 
ORDER BY x.item_id, x.meta_name 

這將得到所有的空值,但每個屬性將在一個單獨的行。

+0

這***代碼***的領域,而不是靈活的新領域 –

+0

@JacquesAmar我添加了一個鏈接到另一個顯示如何動態執行的問題。 – Barmar

+0

@Barmar,謝謝,這工作(一旦糾正'和m.meta_key = x.meta_name' – ChrisH

1

爲獲得結果的每個ITEM_ID你應該使用GROUP_CONCAT(聯接不aggreagtion返回值的相同行幾行)

SELECT item_id, 
GROUP_CONCAT(meta_value ORDER BY field(meta_key, 'first_name', 'last_name', 'age') SEPARATOR ' ') 
FROM wfields as wf 
LEFT JOIN wmeta as wm ON wf.meta_name = wm.meta_key 
GROUP BY item_id 
+0

是的,這是有效的,我會在「真正的」桌上嘗試。如果我想要作爲單獨的記錄,查詢將如何查看?只是刪除'GROUP_CONCAT'顯然不起作用。 很高興爲空作爲缺失記錄 – ChrisH

+0

@ChrisH可能是你需要一個自我加入表3倍,但我不明白你的新目標是什麼..如果你發佈一個新的記錄良好的問題一個明確的例子,你想得到的結果..可能當你發佈新問題評論我的鏈接 – scaisEdge

0

你在找什麼是一個FULL OUTER JOIN JOIN一個表的所有記錄與另一個表,無論是否有鏈接。

+0

MySQL沒有'全外部連接' – Barmar

+0

而那不會將所有屬性放在結果的同一行上。 – Barmar