2017-04-19 23 views
0

我在写一个查询从这样一个表中获取数据的挣扎: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英寸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 

请给我一个查询来做这种转换。谢谢!

回答

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()作品特别是因为你有两个值。如果你有更多的价值,然后问另一个问题与适当的数据。

+0

@SloanThrasher。 。 。你知道'case'是什么吗?这相当有意不*这样做。 –

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`