SELECT *
FROM (
SELECT DISTINCT user_id
FROM user_has_personalities
) uhpo
WHERE EXISTS
(
SELECT NULL
FROM user_has_personalities uhpi
WHERE uhpi.user_id = uhpo.user_id
AND personality_id IN (4, 5, 6, 9, 10)
LIMIT 1 OFFSET 4
)
Значение смещения должно быть на 1
меньше количества элементов в списке IN
.
Если у вас есть личный список в отдельной таблице, используйте это:
SELECT *
FROM (
SELECT DISTINCT user_id
FROM user_has_personalities
) uhpo
WHERE (
SELECT COUNT(*)
FROM perslist p
JOIN user_has_personalities uhpi
ON uhpi.user_id = uhpo.user_id
AND uhpi.personality_id = p.id
) =
(
SELECT COUNT(*)
FROM perslist
)
Чтобы это работало правильно (и быстро), вам нужно иметь индекс UNIQUE
для user_has_personalities (user_id, personality_id)
(в этом порядке).
Если у вас есть таблица users
, и почти у всех пользователей есть запись в user_has_personalities
, то подставьте ее вместо вложенного запроса DISTINCT
:
SELECT user_id
FROM users uhpo
WHERE (
SELECT COUNT(*)
FROM perslist p
JOIN user_has_personalities uhpi
ON uhpi.user_id = uhpo.user_id
AND uhpi.personality_id = p.id
) =
(
SELECT COUNT(*)
FROM perslist
)