2017-04-02 29 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标准中甚至被指定为可以 - 尽管很少的数据库实际上实现了它。