sql >> Database teknologi >  >> RDS >> Mysql

sammenligne datasæt og returnere det bedste match

Det ville hjælpe, hvis du viser os dine tabelstrukturer, så jeg kan være mere specifik.

Jeg går ud fra, at du har en struktur, der ligner denne:

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)

Generelt ville min tilgang være at starte med at tælle hvert særskilt tag.

-- make a list of how often a tag was used:
select tagid, count(*) as `tagscore` from itemtag group by tagid

Dette viser en række for hvert tag, der blev tildelt emnet, med en score.

I vores eksempel ville det være:

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

Forklaring:Forespørgslen har 2 underforespørgsler:Den ene er at hente listemærkerne fra emnet af interesse. Vi ønsker kun at arbejde med dem. Den anden underforespørgsel genererer en liste over scores pr. tag.

Så i sidste ende har hvert element i databasen en liste over tagscore. Disse scores lægges sammen med sum(tagscore) , og det tal bruges til at bestille resultatet (højeste score øverst).

For at vise en liste over tilgængelige tags har jeg brugt GROUP_CONCAT.

Forespørgslen vil resultere i noget som dette (jeg har lavet de faktiske data her):

Item   TagsScore   Tags
item3  15          red,cool,car
item4   7          red,car
item5   7          red
item1   5          car
item6   5          car 


  1. mysql gruppering efter uge

  2. Hvordan øger man et felt i MySql ved hjælp af ON DUPLICATE KEY UPDATE, når der indsættes flere rækker?

  3. MariaDB LENGTH() vs LENGTHB():Hvad er forskellen?

  4. 1 pod har ubundne øjeblikkelige PersistentVolumeClaims på Minikube