2016-07-19 5 views
2

を類似度それに接続された1つ以上のカテゴリを持つことができます。たとえば、アイスクリームはデザート、コールドディッシュなどのカテゴリに関連付けることができます。だから多かれ少なかれ多くの関係。Countはこれを好きな私は、クエリを把握しようとしていると、それが行くのMySQL

table category 
id int pk 
name varchar(50) 

table category_ingredient 
category_id int 
ingredient_id int 

私は、どのように似ている2つの成分がそれらが共有するカテゴリを測定することであるかについての質問をしたいと言います。私の意味は、私のデータベースには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

「成分3」はなぜ「成分1」と100%類似しているのですか? ** A **にはカテゴリ '1'があり、B **には '1,2,3'というカテゴリがあり、これはBがAと100%類似していることを意味しますBがAの検索では機能しない追加のカテゴリを持っているので、最も良い33%です。 – Martin

+0

上記のロジックを質問の例に適用すると、成分3は成分1が現れない1つのカテゴリ(合計4つ)を持つため、**ではなく** 100%ですが、75%です。 – Martin

+0

@Martin私は彼が単にある成分のカテゴリーの何パーセントが他の成分にも存在していることを知りたいと思うと思う。 –

答えて

0

このクエリを実行する "良い"方法は、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 
+0

このクエリをテストしましたか? –

+0

オハイオ州クール、ちょうどそれが何をしたかを把握するために少し時間がかかりました - きれい!ありがとう! – mrmjauh

関連する問題