Es wäre hilfreich, wenn Sie uns Ihre Tabellenstrukturen zeigen würden, damit ich genauer sein kann.
Ich gehe davon aus, dass Sie eine Struktur haben, die dieser ähnelt:
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)
Im Allgemeinen wäre mein Ansatz, mit dem Zählen jedes einzelnen Tags zu beginnen.
-- make a list of how often a tag was used:
select tagid, count(*) as `tagscore` from itemtag group by tagid
Dies zeigt eine Zeile für jedes Tag, das dem Element zugewiesen wurde, mit einer Punktzahl.
In unserem Beispiel wäre das:
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
Erläuterung:Die Abfrage hat zwei Unterabfragen:Eine dient zum Abrufen der Listen-Tags aus dem interessierenden Element. Wir wollen nur mit diesen arbeiten. Die andere Unterabfrage generiert eine Liste mit Punktzahlen pro Tag.
Am Ende hat also jedes Element in der Datenbank eine Liste mit Tag-Scores. Diese Punkte werden mit sum(tagscore)
zusammengezählt , und diese Nummer wird verwendet, um das Ergebnis zu ordnen (höchste Punktzahl oben).
Um eine Liste verfügbarer Tags anzuzeigen, habe ich GROUP_CONCAT.
verwendetDie Abfrage ergibt in etwa Folgendes (ich habe die eigentlichen Daten hier erstellt):
Item TagsScore Tags
item3 15 red,cool,car
item4 7 red,car
item5 7 red
item1 5 car
item6 5 car