SQL加入自我

时间:2014-09-13 08:39:55

标签: mysql sql

我有一张桌子上有人的身份证号码,然后是他们订购的食物:

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的初学者,无法弄清楚如何正确实现代码。

任何方向都会受到高度赞赏。

3 个答案:

答案 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