SQL - 将多个桥表转换为一个表

时间:2017-04-19 16:49:14

标签: mysql sql database

我正在努力编写查询以从这样的表中获取数据:

id    food_id    ingre_id
1     1          13
2     1          9
3     2          13
4     3          5
5     4          9
6     4          10
7     5          5

假设在该表中,每个food只有1或2个ingre id。然后我想要一张这样的表:

item_id    ingre1_id    ingre2_id
1          13           9
2          13           null //any food that have 1 ingre then set ingre2_id to null
3          5            null
4          9            10
5          5            null

请建议我进行此类转换的查询。谢谢!

2 个答案:

答案 0 :(得分:0)

您可以使用聚合。如果您不关心连续排序:

select food_id, min(ingred_id) as ingred1_id,
       (case when min(ingred_id) <> max(ingred_id) then max(ingred_id) end) as ingred2_id
from t
group by food_id;

注意:min() / max()的使用特别有效,因为您有两个值。如果您有更多值,请使用适当的数据询问另一个问题。

答案 1 :(得分:0)

这应该产生你要求的东西:

SELECT
    a.`food_id` as `item_id`,
    a.`ingre_id` as `ingre1_id`,
    b.`ingre_id` as `ingre2_id`
FROM `food` a
LEFT JOIN `food` b
ON a.`id` <> b.`id` AND a.`food_id` = b.`food_id`
WHERE a.`id` < b.`id` OR b.`id` IS NULL
GROUP BY a.`food_id`