2017-07-21 7 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 

उदाहरण:

हम पता लगाना चाहते हैं जो ग्राहकों के लिए सबसे अच्छा मैच ग्राहक 'ए' जो दो निर्माताओं के लिए रेटिंग है, manuf_A और manuf_B

वांछित परिणाम:

customer difference 
D   4   
B   7 
C   11 

उम्मीद एल्गोरिथ्म:

  • छोटे अंतर मूल्य है, करीब से संबंधित दो ग्राहकों
  • हैं एक ग्राहक नहीं खाता है तो विषय ग्राहक के साथ किसी भी निर्माता रेटिंग साझा करें, उनकी मौजूदगी रेटिंग शून्य के बजाय शून्य होनी चाहिए।

बी अंतर:

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 

सी अंतर:

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 

यह कैसे MySQL में किया जा सकता है पर कोई सलाह होगा अच्छी तरह से प्राप्त किया जाना वैकल्पिक दृष्टिकोण के किसी भी सुझाव के साथ।

+1

बस एक टिप्पणी: यह वास्तव में एक अच्छी तरह से लिखा प्रश्न है। आपने एक SQL Fiddle उदाहरण प्रदान किया है (वह काम करता है)। आपने समस्या को स्पष्ट रूप से समझाया है। बोनस के रूप में, यह एक दिलचस्प समस्या है। –

+0

[यूक्लिडियन दूरी] (https://en.wikipedia.org/wiki/Euclidean_distance) एक बेहतर दृष्टिकोण हो सकता है। –

+0

@PaulSpiegel। । । यदि यह आपको बेहतर महसूस करता है, तो इसे मैनहट्टन दूरी कहा जाता है और इस तरह की समस्या के लिए पूरी तरह से उचित है। –

उत्तर

2

यहां एक दृष्टिकोण है। ग्राहकों और निर्माताओं के लिए सभी पंक्तियां उत्पन्न करें जो "ए" ने मूल्यांकन किया है। फिर किसी दिए गए ग्राहक द्वारा रेट किए गए लोगों को ढूंढने के लिए 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

संबंधित मुद्दे