Я хочу получить все отдельные user_ids с помощью item_id = 100 AND item_id = 200. Правильный результат в этом случае будет 1. Но как бы выглядел мой SQL-запрос в этом упрощенном случае? Таблица:
user_id item_id
1 100
1 200
3 100
Использовать условную агрегацию:
SELECT user_id
FROM yourTable
WHERE item_id IN (100, 200)
GROUP BY user_id
HAVING COUNT(DISTINCT item_id) = 2;
Этот трюк сначала ограничивает только записи, соответствующие вашим двум представляющим интерес интересам, тогда он утверждает, что соответствующий пользователь имеет отдельный счетчик элементов из двух, что означает, что он соответствует критериям.
Иногда логика требует этого несколько иначе:
SELECT user_id
FROM yourTable
GROUP BY user_id
HAVING
SUM(CASE WHEN item_id = 100 THEN 1 ELSE 0 END) > 0 AND
SUM(CASE WHEN item_id = 200 THEN 1 ELSE 0 END) > 0;
Эта форма может быть более полезна в определенных ситуациях, но она делает то же самое.
DROP TABLE IF EXISTS T;
CREATE table t(user_id int, item_id int);
insert into t values
(1 , 100),
(1 , 200),
(3 , 100);
select user_id
from t
where item_id in (100, 200)
group by user_id having count(distinct item_id) = 2;
+---------+
| user_id |
+---------+
| 1 |
+---------+
1 row in set (0.00 sec)
Вы можете использовать самообучение (интуитивно понятное):
SELECT DISTINCT(t1.user_id)
FROM table_name AS t1 inner join table_name AS t2
ON t1.user_id=t2.user_id
WHERE t1.item_id=100 and t2.item_id=200;
DISTINCT
также потребуется этап агрегирования.