我一直试图找出一个查询,它就像这样:
我有一个包含成分信息的表格成分:
table ingredient
id int pk
name varchar(50)
我有一个表类别,每种成分可以有一个或多个类别连接到它,例如冰淇淋可能与甜点,冷菜等类别有关。所以有多对多关系。
table category
id int pk
name varchar(50)
table category_ingredient
category_id int
ingredient_id int
让我们说我想通过测量他们共享的类别来询问两种成分的相似之处。我的意思是,假设我的数据库包含3个成分:1,2,3。成分1连接到类别{1,2,3},成分2连接到类别{3,4,5},成分3连接到类别{1,2,3,4}。
进行查询,我将搜索与成分1最相似的成分,这将导致:
Ingredient 3 100%
Ingredient 2 33%
有关如何实现此类查询的任何想法?
答案 0 :(得分:0)
" nice"方式(在我看来)做这个查询将是使用涉及CASE WHEN ... IN
表达式的条件聚合,但MySQL似乎不支持这一点。相反,我针对整个category_ingredient
表格对第一个成分进行交叉连接,并计算每种成分的共同类别数量。这个数字除以第一种成分中的类别总数,得出共同的百分比。
SELECT t2.ingredient_id,
100 * SUM(CASE WHEN t1.category_id = t2.category_id THEN 1 ELSE 0 END) /
(SELECT COUNT(*) FROM category_ingredient WHERE ingredient_id = 1) AS commonCount
FROM category_ingredient t1
INNER JOIN category_ingredient t2
ON t1.ingredient_id = 1
GROUP BY t2.ingredient_id