Первый оператор SQL возвращает ссылку, где ссылка содержит два
конкретные tag_ids.
Это работает тогда и только тогда, когда есть ограничение первичного ключа или ограничение уникальности {link_id, tag_id}. Я добавил это ограничение (имеет смысл) и включу операторы CREATE TABLE и INSERT для других. (Вы должны были это сделать. Вы редактируете свой вопрос и вставляете этот материал, если хотите.)
create table totals (
link_id integer not null,
tag_id integer not null,
score integer not null,
primary key (link_id, tag_id)
);
insert into totals values
(1, 6, 5 ),
(1, 8, 2 ),
(1, 3, 1 ),
(2, 6, 6 ),
(2, 4, 2 ),
(3, 6, 1 ),
(3, 2, 4 ),
(3, 8, 3 ),
(4, 2, 4 ),
(4, 6, 1 ),
(4, 8, 2 );
Перефразируя вопрос, основываясь на комментариях, вы ищете номера идентификаторов ссылок, которые имеют
- оба идентификатора тега с номерами 6 и 8 и
- , чей счет для идентификатора тега 6 выше, чем их счет для идентификатора тега 8
Для начала, легко увидеть, что эти два запроса дадут вам оценки за
- все строки, имеющие tag_id = 6, и
все строки, имеющие tag_id = 8
select *
from totals
where tag_id = 6
select *
from totals
where tag_id = 8
Это достаточно просто.
Мы можем легко объединить два запроса с помощью общего табличного выражения.
with score_for_8 as (
select *
from totals
where tag_id = 8
)
select totals.*
from totals
inner join score_for_8
on score_for_8.link_id = totals.link_id and
totals.score > score_for_8.score
where totals.tag_id = 6;
Поскольку для этого не требуется группировать, упорядочивать или ограничивать набор результатов, он будет правильно сообщать о связях.
Я почти уверен, что это не совсем то, что вы ищете, но я не понимаю ваш последний комментарий.