Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Vergleichen Sie Datensätze und geben Sie die beste Übereinstimmung zurück

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.

verwendet

Die 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