2017-04-02 28 views
0

由於2-天,我想找到一個解決方案...

SQL連接映射表,並取回列不列

我有兩個表:

- 組件 - colums: ID |名稱|說明

- components_ingredients - colums: component_id | ingredient_id

=>一個組件可以有多種成分

所以當我加入我的發言表:

SELECT * FROM組分c INNER JOIN components_ingredients CI ON c.id = ci.component_id

我爲表ci中的每種成分找回一行。但是我想回到只有一行與匹配的成分作爲額外的列,如:

c.id | c.name | c.description | ci.ingredient1 | ci.ingredient2 | ci.ingredient3 ...

這是可能的,何時?

感謝

+0

你在找什麼是PIVOT。類似的問題有多種答案。這裏是一個:http://stackoverflow.com/questions/7674786/mysql-pivot-table – Kevin

回答

0

您可以嘗試使用MySQL的GROUP_CONCAT()函數創建的成分爲每個給定成分的CSV列表。

SELECT c.id, c.name, c.description, ci.ingredients 
FROM components c 
INNER JOIN 
(
    SELECT component_id, GROUP_CONCAT(ingredient_id) AS ingredients 
    FROM components_ingredients 
    GROUP BY component_id 
) ci 
    ON c.id = ci.component_id 

注意,作爲@Gordon指出的那樣,你或許可以不我使用子查詢做,但一般而言,您可能需要它。即使根據ANSI標準,Gordon的查詢工作的原因是id中的components表應該唯一確定namedescription。因此,在使用GROUP BY的同時包含這些列是可以的,因爲沒有涉及任何歧義。

0

很難將原料放在單獨的色譜柱中,因爲您現在不會有多少種成分。

容易得多是一起將它們串聯成一個字符串中的一列:

SELECT c.*, GROUP_CONCAT(ci.component_id) as component_ids 
FROM components c INNER JOIN 
    components_ingredients ci 
    ON c.id = ci.component_id 
GROUP BY c.id; 

注:這是一般不好的做法,包括在SELECT不在的GROUP BY列。但是,在這種情況下可以,因爲components.id可以唯一標識每一行。這個功能在ANSI標準中甚至被指定爲可以 - 儘管很少的數據庫實際上實現了它。