Mysql
 sql >> база данни >  >> RDS >> Mysql

сравнете набори от данни и върнете най-доброто съвпадение

Ще помогне, ако ни покажете структурите на таблиците си, за да мога да бъда по-конкретен.

Предполагам, че имате структура, която прилича на тази:

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)

Като цяло моят подход би бил да започна с преброяване на всеки отделен маркер.

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

Това показва ред за всеки етикет, който е присвоен на елемента, с резултат.

В нашия пример това би било:

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

Обяснение:Заявката има 2 подзаявки:Едната е да се получат етикетите на списъка от елемента, който представлява интерес. Искаме да работим само с тях. Другата подзаявка генерира списък с резултати за етикет.

Така че в крайна сметка всеки елемент в базата данни има списък с резултати на тагове. Тези резултати се събират с sum(tagscore) и това число се използва за подреждане на резултата (най-високите резултати отгоре).

За да покажа списък с налични етикети, използвах GROUP_CONCAT.

Заявката ще доведе до нещо подобно (направил съм действителните данни тук):

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


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Число от bind_result прекъсва масива php

  2. Използване на node-mysql във функция

  3. Как да получите достъп до данни от таблица с помощта на php mysql?

  4. Как да решим проблема с кодирането на символи в MySQL?

  5. защо разделяме една mysql таблица на много по-малки таблици?