计算MySQL

时间:2016-07-19 12:27:13

标签: mysql

我一直试图找出一个查询,它就像这样:

我有一个包含成分信息的表格成分:

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%

有关如何实现此类查询的任何想法?

1 个答案:

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