Как я могу выполнить этот запрос SELECT? - PullRequest
0 голосов
/ 23 февраля 2020

Я работаю над функцией обмена сообщениями для приложения, и у меня есть следующие таблицы в MS SQL вместе с таблицей пользователя (не указана):

CREATE TABLE Thread (
    id int IDENTITY(1,1),
    createdAt datetimeoffset NOT NULL,
    CONSTRAINT PK_Thread_id PRIMARY KEY (id)
) GO

CREATE TABLE ThreadParticipant (
    userId int NOT NULL,
    threadId int NOT NULL,
    createdAt datetimeoffset NOT NULL,
    CONSTRAINT PK_userId_threadId PRIMARY KEY (userId, threadId),
    CONSTRAINT FK_ThreadParticipant_userId FOREIGN KEY (userId) REFERENCES User(id) ON DELETE CASCADE,
    CONSTRAINT FK_ThreadParticipant_threadId FOREIGN KEY (threadId) REFERENCES Thread(id) ON DELETE CASCADE
) GO

Я хочу запросить в таблице ThreadParticipant, существует ли поток, содержащий только данный набор идентификаторов пользователей, скажем, пользователи 1,3,5,7. Каждый Thread содержит уникальный набор идентификаторов пользователей. Как я могу запросить эти данные? Если проще, я могу поместить некоторые логики c на сервер (node.js). Я искал дубликаты вопросов в Интернете и не могу их найти, хотя точно не знаю, как сформулировать вопрос, чтобы найти их, если они рядом.

Ответы [ 2 ]

1 голос
/ 23 февраля 2020

Вы можете использовать агрегацию с предложением having:

select tp.threadid
from ThreadParticipant tp
where tp.userid in (1, 3, 5, 7)
group by tp.threadid
having count(*) = 4;

РЕДАКТИРОВАТЬ:

Если вы хотите ТОЛЬКО этих пользователей, используйте:

select tp.threadid
from ThreadParticipant tp
group by tp.threadid
having sum(case when tp.userid in (1, 3, 5, 7) then 1 else 0 end) = 4
0 голосов
/ 23 февраля 2020

Вы можете использовать exists:

select 
    t.*,
    case 
        when exists (
            select 1 
            from threadParticipant p 
            where p.threadId = t.id and p.userid not in (1, 3, 5, 7)
        ) 
        then 'not only these users'
        else 'these users only'
    end status
from thread t

Столбцы status указывают, содержит ли поток пользователя, отличного от 1, 3, 5, 7.

...