Sẽ hữu ích nếu bạn cho chúng tôi xem cấu trúc bảng của bạn, vì vậy tôi có thể nói cụ thể hơn.
Tôi giả sử bạn có cấu trúc giống như sau:
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)
Nói chung, cách tiếp cận của tôi sẽ là bắt đầu bằng cách đếm từng thẻ riêng biệt.
-- make a list of how often a tag was used:
select tagid, count(*) as `tagscore` from itemtag group by tagid
Điều này hiển thị một hàng cho mỗi thẻ đã được chỉ định cho mặt hàng, với một điểm số.
Trong ví dụ của chúng tôi, đó sẽ là:
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
Giải thích:Truy vấn có 2 truy vấn con:Một là lấy các thẻ danh sách từ mục quan tâm. Chúng tôi chỉ muốn làm việc với những truy vấn đó. Truy vấn con khác tạo ra một danh sách điểm cho mỗi thẻ.
Vì vậy, cuối cùng, mỗi mục trong cơ sở dữ liệu có một danh sách các điểm thẻ. Những điểm số đó được cộng lại với sum(tagscore)
, và số đó được sử dụng để sắp xếp kết quả (điểm cao nhất ở trên cùng).
Để hiển thị danh sách các thẻ có sẵn, tôi đã sử dụng GROUP_CONCAT.
Truy vấn sẽ dẫn đến kết quả như thế này (Tôi đã tạo dữ liệu thực tế ở đây):
Item TagsScore Tags
item3 15 red,cool,car
item4 7 red,car
item5 7 red
item1 5 car
item6 5 car