sql >> Databáze >  >> RDS >> Mysql

porovnat soubory dat a získat nejlepší shodu

Pomohlo by, kdybyste nám ukázali své struktury tabulek, abych mohl být konkrétnější.

Předpokládám, že máte strukturu, která se podobá této:

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)

Můj přístup by obecně byl začít tím, že bych počítal každou samostatnou značku.

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

Zobrazí se řádek pro každou značku, která byla přiřazena k položce, se skóre.

V našem příkladu by to bylo:

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

Vysvětlení:Dotaz má 2 poddotazy:Jedním z nich je získat značky seznamu z položky zájmu. Chceme pracovat pouze s těmi. Druhý dílčí dotaz vygeneruje seznam skóre na značku.

Takže nakonec má každá položka v databázi seznam skóre značek. Tato skóre se sčítají pomocí sum(tagscore) a toto číslo se používá k seřazení výsledku (nejvyšší skóre nahoře).

K zobrazení seznamu dostupných značek jsem použil GROUP_CONCAT.

Výsledkem dotazu bude něco takového (skutečná data jsem vytvořil zde):

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


  1. Funkce DECOMPOSE() v Oracle

  2. PostgreSQL - Instalace ovladače JDBC

  3. DPI-1047:64bitovou knihovnu klienta Oracle nelze načíst

  4. SQL:Získejte záznamy vytvořené v časovém rozsahu pro konkrétní data