簡體   English   中英

SQL與自我結合

[英]SQL join with self

我有一張桌子,上面有人的ID號,然后是他們點的食物:

表“ 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的初學者,無法弄清楚如何正確實現代碼。

任何方向將不勝感激。

為了避免重復計數的問題,您可以從連接中合並兩個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;

觀看演示

就像您說的那樣,您可以進行自我加入。 您可以按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

您可以運行以下查詢以獲取所需的輸出:

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

檢查演示

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM