2017-07-21 4 views
5

私は次の表を持っています。私の目標は、他の特定の顧客に最も類似している顧客を、特定のメーカーの評価方法で検索することです。この例はSQL fiddleにあります。MySQL:複数の行の数値の違いによってSQLクエリの結果を注文するにはどうすればよいですか?

customer manufacturer rating 
A   Manuf_A   8 
A   Manuf_B   3 
B   Manuf_A   4 
B   Manuf_Y   3   
C   Manuf_X   3 
C   Manuf_Y   7 
D   Manuf_A   8 
D   Manuf_B   7 

例:

我々は、顧客ベストマッチの顧客2メーカー、manuf_Amanuf_Bの格付けを持っている ''を見つけたいです。

望ましい結果:

customer difference 
D   4   
B   7 
C   11 

期待アルゴリズム:

  • 差分値が小さいほど、より近い顧客がない場合は、2人の顧客が
  • をしている関連製造元の評価を対象の顧客と共有する場合は、それらの存在しない評価をゼロにする必要があります。

B差:

abs(A.manuf_A.rating (8) - B.manuf_A.rating(4)) = 4 
abs(A.manuf_B.rating (3) - B.manuf_B.rating(Doesn't exist/0)) = 3 
= 4 + 3 
= 7 

C差:

abs(A.manuf_A.rating (8) - C.manuf_A.rating(Doesn't exist/0)) = 8 
abs(A.manuf_B.rating (3) - C.manuf_B.rating(Doesn't exist/0)) = 3 
= 8 + 3 
= 11 

D差:これはMySQLので行うことができる方法について

abs(A.manuf_A.rating (8) - D.manuf_A.rating(8)) = 0 
abs(A.manuf_B.rating (3) - D.manuf_A.rating(7)) = 4 
= 0 + 4 
= 4 

任意のアドバイスは好評であろう代替アプローチの提案とともに

+1

コメント:これは本当によく書かれた質問です。あなたはSQL Fiddleの例を提供しました。問題をはっきりと説明しました。ボーナスとして、それは興味深い問題です。 –

+0

[ユークリッド距離](https://en.wikipedia.org/wiki/Euclidean_distance)が良いアプローチかもしれません。 @PaulSpiegel。 –

+0

。 。あなたが気分を良くするなら、これはマンハッタン距離と呼ばれ、このような問題に対しては完全に合理的です。 –

答えて

2

ここに1つのアプローチがあります。 「A」が評価した顧客および製造業者のすべての行を生成します。その後、left joinを使用して、特定の顧客が評価したものを見つけます。残りは単なる算術演算です。

select c.customer, 
     sum(abs(am.rating - coalesce(cd.rating, 0))) as similarity 
from (select cd.manufacturer, cd.rating 
     from centraldatabase cd 
     where cd.customer = 'A' 
    ) am cross join 
    customers c left join 
    centraldatabase cd 
    on cd.manufacturer = am.manufacturer and cd.customer = c.customer 
group by c.customer 
order by similarity asc; 

ここにはSQLFiddleがあります。注:SQL Fiddleで独自のスキーマを作成することをお勧めしますか?

+0

すばらしい返答をいただき、ありがとうございました。 MySQLには比較的新しいので、私はうれしくなるでしょう ここで何が起こっているのかを少し時間をかけて過ごしてください:)ああ、そのスキーマの作成は幾つかの奇妙なことを説明するでしょう! – mgibson

関連する問題