Mysql
 sql >> डेटाबेस >  >> RDS >> Mysql

डेटा सेट की तुलना करें और सर्वश्रेष्ठ मिलान लौटाएं

यदि आप हमें अपनी तालिका संरचनाएँ दिखाते हैं तो इससे मदद मिलेगी, इसलिए मैं अधिक विशिष्ट हो सकता हूँ।

मैं मान रहा हूँ कि आपके पास एक संरचना है जो इससे मिलती-जुलती है:

Table item: (id, itemname)
1 item1
2 item2
3 item3
4 item4
5 item5

Table tag: (id, tagname)
1 cool
2 red
3 car

Table itemtag: (id, itemid, tagid)
1 1 2 (=item1, red)
2 2 1 (=item2, cool)
3 2 3 (=item2, car)
4 3 1 (=item3, cool)
5 3 2 (=item3, red)
6 3 3 (=item3, car)
7 4 3 (=item3, car)
8 5 3 (=item3, car)

सामान्य तौर पर मेरा दृष्टिकोण प्रत्येक अलग टैग की गणना करके शुरू करना होगा।

-- make a list of how often a tag was used:
select tagid, count(*) as `tagscore` from itemtag group by tagid

यह प्रत्येक टैग के लिए एक पंक्ति दिखाता है जो आइटम को एक अंक के साथ असाइन किया गया था।

हमारे उदाहरण में, यह होगा:

tag  tagscore
1    2         (cool, 2x)
2    2         (red, 2x)
3    4         (car, 4x)


set @ItemOfInterest=2;

select
  itemname,
  sum(tagscore) as `totaltagscore`,
  GROUP_CONCAT(tags) as `tags`
from
  itemtag
join item on itemtag.itemid=item.id

join
  /* join the query from above (scores per tag) */
  (select tagid, count(*) as `tagscore` from itemtag group by tagid ) as `TagScores`
  on `TagScores`.tagid=itemtag.tagid
where
  itemid<>@ItemOfInterest and 
  /* get the taglist of the current item */
  tagid in (select distinct tagid from itemtag where [email protected])
group by
  itemid
order by
  2 desc

स्पष्टीकरण:क्वेरी में 2 उपश्रेणियाँ हैं:एक रुचि की वस्तु से सूची टैग प्राप्त करना है। हम केवल उन्हीं के साथ काम करना चाहते हैं। अन्य सबक्वेरी प्रति टैग स्कोर की एक सूची तैयार करती है।

तो अंत में, डेटाबेस में प्रत्येक आइटम में टैग स्कोर की एक सूची होती है। उन स्कोरों को sum(tagscore) . के साथ जोड़ दिया जाता है , और उस संख्या का उपयोग परिणाम (शीर्ष पर उच्चतम स्कोर) को ऑर्डर करने के लिए किया जाता है।

उपलब्ध टैग की सूची दिखाने के लिए, मैंने GROUP_CONCAT का उपयोग किया है।

क्वेरी का परिणाम कुछ इस तरह होगा (मैंने वास्तविक डेटा यहां बनाया है):

Item   TagsScore   Tags
item3  15          red,cool,car
item4   7          red,car
item5   7          red
item1   5          car
item6   5          car 


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. utf8 में से कौन सा संयोजन सबसे अच्छा है?

  2. QUERY पैकेट भेजते समय त्रुटि

  3. आवर्ती घटना वाले डेटाबेस के लिए इष्टतम डिजाइन

  4. किसी दिए गए पैरेंट नोड के सभी बच्चों (और उनके बच्चों) को MySQL/MariaDB रिलेशनल टेबल में प्राप्त करना

  5. MySQL SELECT * क्वेरी को समानांतर में निष्पादित करना