我有一张桌子上有人的身份证号码,然后是他们订购的食物:
table" food_id"
food id
ham 1
cheese 2
turkey 2
ham 3
ham 4
bread 5
cheese 6
turkey 6
cheese 7
我想使用SQL来为每个id计算出订购至少一个相同食品的其他ID的总数。对于上面的例子,答案应该是:
" result_table"
count id
3 1
3 2
3 3
3 4
1 5
3 6
3 7
挑战在于避免重复计算。例如,2号人同时吃了奶酪和火鸡,所以我们希望他的最终数量为3,因为第2,第6和第7人得到了奶酪,第2和第6人得到了火鸡,并且这里有3个唯一的ID清单(2,6,7,2,6)。
我最初的想法是首先获得一个包含食品项目到不同ID号的表,然后将该表与原始表连接,然后按ID号分组,并获得不同ID数的计数。但是,我是SQL的初学者,无法弄清楚如何正确实现代码。
任何方向都会受到高度赞赏。
答案 0 :(得分:1)
为了避免重复计算的问题,您可以从联接中连接两个ID并仅计算不同的组合。我添加了一个分隔符,使组合具有更大的id值:
SELECT
COUNT(DISTINCT CONCAT(f1.id, ',', f2.id)) as count,
f1.id
FROM
food_id f1
INNER JOIN
food_id f2
ON
f1.food = f2.food
GROUP BY f1.id;
请参阅demo
答案 1 :(得分:1)
就像你说的那样,你可以自我加入。您可以food
加入,并计算distinct
匹配ID的数量。
select
a.id, -- Person you're investigating
count(distinct b.id) as samefoodcount -- number of people sharing the same food
from
food_id a
inner join food_id b on b.food = a.food
group by
a.id
您可以在此处查看运行中的查询:http://sqlfiddle.com/#!2/c53884/1
答案 2 :(得分:-1)
您可以运行以下查询以获得所需的输出:
select MAX(T.total),id
from table_name, (select count(*) as total,food from table_name group by food) T
where table_name.food=T.food
group by id
检查DEMO