2017-07-21 21 views
5

Tôi có bảng sau đây và mục tiêu của tôi là tìm kiếm khách hàng gần giống nhất với một khách hàng nhất định khác trong cách họ xếp hạng các nhà sản xuất nhất định. Ví dụ này có thể được tìm thấy trong số này SQL fiddle.MySQL: Cách đặt hàng kết quả truy vấn SQL bằng số khác biệt của nhiều hàng?

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 

Ví dụ:

Chúng tôi muốn tìm mà khách hàng tốt nhất phù hợp với khách hàng 'A' người có một đánh giá cho hai nhà sản xuất, manuf_Amanuf_B.

kết quả mong muốn:

customer difference 
D   4   
B   7 
C   11 

thuật toán dự kiến:

  • càng nhỏ giá trị khác biệt là, gần gũi hơn liên quan đến hai khách hàng là
  • Nếu một khách hàng không chia sẻ bất kỳ xếp hạng của nhà sản xuất nào với khách hàng chủ đề, xếp hạng không tồn tại của chúng phải bằng 0. Sự khác biệt

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 khác biệt:

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 khác biệt:

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 

Bất cứ lời khuyên về cách thức này có thể được thực hiện trong MySQL sẽ được đón nhận nồng nhiệt cùng với bất kỳ đề xuất nào về cách tiếp cận thay thế.

+1

Chỉ cần một bình luận: Đây là một câu hỏi thực sự được viết tốt. Bạn đã cung cấp một ví dụ SQL Fiddle (hoạt động). Bạn đã giải thích rõ vấn đề. Là một tiền thưởng, nó là một vấn đề thú vị. –

+0

[Khoảng cách Euclide] (https://en.wikipedia.org/wiki/Euclidean_distance) có thể là một cách tiếp cận tốt hơn. –

+0

@PaulSpiegel. . . Nếu nó làm cho bạn cảm thấy tốt hơn, điều này được gọi là Manhattan khoảng cách và là hoàn toàn hợp lý cho một vấn đề như thế này. –

Trả lời

2

Đây là một cách tiếp cận. Tạo tất cả các hàng cho khách hàng và nhà sản xuất mà "A" đã xếp hạng. Sau đó, sử dụng left join để tìm giá được xếp hạng bởi bất kỳ khách hàng nhất định nào. Phần còn lại chỉ là số học:

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; 

Đây là SQLFiddle. Lưu ý: Tôi không biết có nên tạo lược đồ của riêng bạn trong SQL Fiddle hay không.

+0

Cảm ơn rất nhiều, vì phản hồi nhanh và vì công trình này tuyệt vời! Tương đối mới với MySQL vì vậy tôi sẽ vui vẻ dành một chút thời gian tiêu hóa những gì đang xảy ra ở đây :) Ah có, tạo lược đồ đó sẽ giải thích một vài điều kỳ quặc! – mgibson

Các vấn đề liên quan