SQL для простого ранжирования по релевантности - PullRequest
0 голосов
/ 17 апреля 2019

У меня есть 3 таблицы: person_tag (person_id, тег), Interest_tag (Interest_id, тег), skill_tag (skill_id, тег).Как бы я ни хотел иметь одну таблицу тегов для интереса и навыков, мне нужно держать их отдельно.Ниже приведены примеры данных:

+-----------+-------------+
| person_id | tag         |   
+-----------+-------------+
| 1         | x           |
| 1         | y           |
| 1         | z           |
+-----------+-------------+

+-------------+-------------+
| interest_id | tag         |   
+-------------+-------------+
| 10          | x           |
| 20          | y           |
| 20          | z           |
+-------------+-------------+

+-------------+-------------+
| skill_id    | tag         |   
+-------------+-------------+
| 100         | x           |
| 100         | y           |
| 100         | z           |
| 900         | a           |
+-------------+-------------+

Я хотел бы написать запрос, который вернул бы результат, подобный следующему, с точки зрения релевантности для данного person_id (например, 1).Обратите внимание, что «a» не появляется в результатах ниже:

+-------------+-------------+-------------+
| id          | typ         | score       |
+-------------+-------------+-------------+
| 100         | skill       | 3           |
| 20          | interest    | 2           |
| 10          | interest    | 1           |
+-------------+-------------+-------------+

Я подозреваю, что UNION будет моим другом здесь, но не совсем уверен, как написать запрос.У кого-нибудь есть предложение?

Ответы [ 2 ]

0 голосов
/ 17 апреля 2019

Да, союз будет работать

select interest_id as id,count(*) as score, 'Interest' as typ from interest group by interest_id
union
select skill_id as id,count(*) as score, 'Skill' as typ from skill group by skill_id;
0 голосов
/ 17 апреля 2019

Вы можете использовать union all с group by выражениями

select skill_id , 'skill' as typ, count( skill_id ) as score 
  from skill_tag 
 group by skill_id
union all
select interest_id , 'interest' as typ, count(interest_id) as score 
  from interest_tag 
 group by interest_id
 order by score desc

PS Кстати, вам не нужна таблица person_tag.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...