यदि आप हमें अपनी तालिका संरचनाएँ दिखाते हैं तो इससे मदद मिलेगी, इसलिए मैं अधिक विशिष्ट हो सकता हूँ।
मैं मान रहा हूँ कि आपके पास एक संरचना है जो इससे मिलती-जुलती है:
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