2017-07-21 15 views
5

Aşağıdaki tabloya sahibim ve amacım, belirli bir müşteriye, belirli üreticilere nasıl derecelendirdikleri konusunda en yakın müşterileri aramaktır. Bu örnek bu SQL fiddle'da bulunabilir.MySQL: Birden çok satırın sayısal farkıyla bir SQL sorgusu sonucu nasıl sipariş edilir?

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 

Örnek: Biz bulmak istiyoruz

hangi müşterilerin en iyi eşleşme müşteri 'A' iki üreticileri için bir puana sahip, manuf_A ve manuf_B.

İstenilen sonuçlar:

customer difference 
D   4   
B   7 
C   11 

Beklenen algoritması:

  • fark değeridir küçük, daha yakın bir müşteri değilse iki müşteri
  • olan ilgili Herhangi bir üretici puanını konu olan müşteri ile paylaşın, mevcut olmayan derecelendirmeleri sıfır olmalıdır.

B farkı:

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ı farkı:

D farkı
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 

:

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 

bu MySQL yapılabilir ilgili herhangi bir tavsiye de alınacağı alternatif bir yaklaşımın önerileri ile birlikte.

+1

Sadece bir yorum: Bu gerçekten iyi yazılmış bir sorudur. SQL Fiddle örneği sağladınız (çalışır). Sorunu açık bir şekilde açıkladınız. Bonus olarak, ilginç bir sorundur. –

+0

[Euclidean distance] (https://en.wikipedia.org/wiki/Euclidean_distance) daha iyi bir yaklaşım olabilir. –

+0

@PaulSpiegel. . . Eğer kendinizi daha iyi hissettirirseniz, bu Manhattan mesafesi olarak adlandırılır ve böyle bir sorun için mükemmeldir. –

cevap

2

İşte bir yaklaşım. Müşteriler ve "A" nın sahip olduğu üreticiler için tüm satırları oluşturun. Daha sonra, herhangi bir müşteri tarafından derecelendirilenleri bulmak için left join kullanın. Kalan sadece aritmetik: SQLFiddle. Not: SQL Fiddle'da kendi şemayı oluşturmanın iyi bir fikir olup olmadığını bilmiyorum.

+0

Çok teşekkürler, hızlı yanıt için ve bu harika çalışıyor! MySQL için nispeten yeni olan bu yüzden mutlu olacağım Burada neler olup bittiğini anlamak için biraz zaman harcıyor :) Ah evet, bu şema oluşturma birkaç tuhaflığı açıklıyor! – mgibson

İlgili konular