Порядок SQL по количеству общих значений - PullRequest
1 голос
/ 23 февраля 2011

У меня есть таблица настройки следующим образом:

+---------------+
| resources     |
+---------------+
| id            |
| name          |
+---------------+
+-------------------+
| resource_subjects |
+-------------------+
| resource_id       |
| subject_id        |
+-------------------+

Что мне нужно сделать, так это создать запрос, который находит количество общих объектов между двумя ресурсами.

То есть с таблицей resource_subjects, подобной этой:

+---------------------------+
| resource_id | subject_id  |
+---------------------------+
| resource1   | 1           |
| resource1   | 2           |
| resource1   | 3           |
| resource1   | 4           |
| resource1   | 5           |
| resource2   | 1           |
| resource2   | 2           |
| resource2   | 3           |
| resource3   | 1           |
| resource3   | 4           |
+---------------------------+

Я бы хотел, чтобы этот запрос дал мне что-то вроде:

+----------------------------------------------------------+
| first_resource | second_resource | shared_subjects_count |
+----------------------------------------------------------+
| resource1      | resource2       | 3                     |
| resource1      | resource3       | 2                     |
| resource2      | resource3       | 1                     |
+----------------------------------------------------------+

Чтобы понять эту идею, псевдокод в моей голове будет выглядеть примерно так:

ВЫБРАТЬ id AS first_resource, id AS second_resource, COUNT (количество предметов делится между first_resource и second_resource в таблице resource_subjects) AS shared_subjects_count ЗАКАЗАТЬ ПО shared_subjects_count DESC

Если кто-то может предоставить пример запроса или даже указать мне правильное направление, это было бы удивительно.

Спасибо

Ответы [ 2 ]

0 голосов
/ 23 февраля 2011

Это похоже на работу в MySql:

select
  a.resource_id as first_resource,
  b.resource_id as second_resource,
  count(*) as shared_subjects_count

from
  resource_subjects as a,
  resource_subjects as b

where
  a.resource_id < b.resource_id
  and a.subject_id = b.subject_id
  group by a.resource_id,b.resource_id;
0 голосов
/ 23 февраля 2011

Чтобы создать таблицу, аналогичную вашей, я использовал:

CREATE TABLE resource_subjects (
res_id int(11),
sub_id int(11)
);

INSERT INTO resource_subjects VALUES 
(1,1),
(1,2),
(1,3),
(1,4),
(1,5),
(2,1),
(2,2),
(2,3),
(3,1),
(3,4);

И затем запрос, который вы можете использовать:

SELECT t2.res_id 'first', t1.res_id 'second', COUNT(t1.sub_id)
FROM resource_subjects t1
JOIN resource_subjects t2 ON t1.res_id > t2.res_id AND t1.sub_id = t2.sub_id 
GROUP BY 1,2

Обратите внимание, что мой resource_id является реальным идентификатором (целое число), а не строка, которая допускает условие «больше, чем» в предложении ON.

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