sql >> Databasteknik >  >> RDS >> Mysql

jämför datamängder och ger bästa matchning

Det skulle hjälpa om du visar oss dina tabellstrukturer, så att jag kan vara mer specifik.

Jag antar att du har en struktur som liknar denna:

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)

I allmänhet skulle mitt tillvägagångssätt vara att börja med att räkna varje separat tagg.

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

Detta visar en rad för varje tagg som tilldelades objektet, med en poäng.

I vårt exempel skulle det vara:

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

Förklaring:Frågan har 2 underfrågor:Den ena är att hämta listtaggarna från objektet av intresse. Vi vill bara arbeta med dessa. Den andra underfrågan genererar en lista med poäng per tagg.

Så i slutändan har varje objekt i databasen en lista med taggpoäng. Dessa poäng läggs ihop med sum(tagscore) , och det numret används för att sortera resultatet (högsta poängen överst).

För att visa en lista över tillgängliga taggar har jag använt GROUP_CONCAT.

Frågan kommer att resultera i något i stil med detta (jag har gjort de faktiska uppgifterna här):

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


  1. SQLzoo JOIN handledning #13

  2. Oracle kryptera/dekryptera en klump

  3. SQL Self-join med datajämförelse för olika dagar

  4. Introduktion till Firebase