Akan membantu jika Anda menunjukkan kepada kami struktur tabel Anda, jadi saya bisa lebih spesifik.
Saya berasumsi Anda memiliki struktur yang menyerupai ini:
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)
Secara umum pendekatan saya adalah memulai dengan menghitung setiap tag terpisah.
-- make a list of how often a tag was used:
select tagid, count(*) as `tagscore` from itemtag group by tagid
Ini menunjukkan baris untuk setiap tag yang ditetapkan ke item, dengan skor.
Dalam contoh kita, itu adalah:
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
Penjelasan:Kueri memiliki 2 subkueri:Salah satunya adalah untuk mendapatkan tag daftar dari item yang diminati. Kami hanya ingin bekerja dengan itu. Subkueri lainnya menghasilkan daftar skor per tag.
Jadi pada akhirnya, setiap item dalam database memiliki daftar skor tag. Skor tersebut dijumlahkan dengan sum(tagscore)
, dan angka tersebut digunakan untuk mengurutkan hasil (skor tertinggi di atas).
Untuk menampilkan daftar tag yang tersedia, saya telah menggunakan GROUP_CONCAT.
Kueri akan menghasilkan sesuatu seperti ini (Saya telah membuat data aktual di sini):
Item TagsScore Tags
item3 15 red,cool,car
item4 7 red,car
item5 7 red
item1 5 car
item6 5 car