SQL: Как вы выбираете только те группы, в которых любая заданная группа имеет все заданные значения? - PullRequest
0 голосов
/ 27 февраля 2019

С учетом такой таблицы (которую я получил, используя соединения и ссылки)

| post_id | comment_id |
|    1    |     100    |
|    1    |     101    |
|    1    |     102    |
| .  2 .  | .   100 .  |
| .  3 .  | .   101 .  |
| .  3 .  | .   102 .  |

и список из одного или нескольких идентификаторов комментариев.

(100, 101)

Найти только те сообщения, в которых сообщение не имеет ALL с указанными значениями comment_ids


Итак, с этой таблицей и списком comment_id (100 101),он должен возвращать идентификатор записи (2,3), потому что идентификаторы записи 2 и 3 не имеют комментариев 100 и 101.

При наличии списка comment_id (101) он должен возвращать идентификатор записи (2).

С comment_id (103) он должен вернуть post_id (1,2,3), потому что эти сообщения не имеют комментария 103 (который не существует).


Редактировать:

Мне удалось заставить его работать только с одним комментарием, введенным с этим кодом.

select post_id
from table_name
group by post_id
having count(*) = sum( comment_id not in (100) )

Я добавил «не» из ответа Гордона, чтобы заставить его работать, но когда я использую большечем один комментарий типа:

having count(*) = sum( comment_id not in (100, 102) )

, тогда он возвращает все post_ids (1,2,3).Должно быть только возвращение post_id (2,3).Post_id 1 имеет как 100, так и 102 comment_ids, поэтому его нельзя включить в запрос.

Как мне получить несколько идентификаторов комментариев?

Ответы [ 2 ]

0 голосов
/ 27 февраля 2019

Как и по вашему запросу, каждое сообщение должно содержать не более 3 comment_id.Соответственно ниже приведен запрос для поиска с отсутствием того же

        SELECT POST_ID FROM TABLE
           GROUP BY POST_ID HAVING 
       COUNT(Distinct COMMENT_ID) <3
0 голосов
/ 27 февраля 2019

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

select post_id
from t
group by post_id
having count(*) = sum( comment_id in (2, 3) );

Предполагается, что в таблице нет дубликатов.Если это возможно, то:

having count(distinct comment_id) = count(distinct case when comment_id in (2, 3) then comment_id end)

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

Я, должно быть, неправильно прочитал оригинальный пост.Я думал, что вы хотели те, у которых были все комментарии.Итак, вы хотите:

select post_id
from t
group by post_id
having 2 <> sum( comment_id in (2, 3) );
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...