SQL-将多个桥桌转换为一对一的桌子



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

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

请建议我查询进行这样的转换。谢谢!

您可以使用聚合。如果您不在乎一排的订购:

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()的这种使用专门起作用,因为您有两个值。如果您有更多的值,请与适当的数据询问另一个问题。

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

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`

最新更新