MySQL Query: получение различных значений для этого запроса

0

Я хочу получить все отдельные user_ids с помощью item_id = 100 AND item_id = 200. Правильный результат в этом случае будет 1. Но как бы выглядел мой SQL-запрос в этом упрощенном случае? Таблица:

user_id    item_id
1          100
1          200
3          100
Теги:

3 ответа

3
Лучший ответ

Использовать условную агрегацию:

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;

Эта форма может быть более полезна в определенных ситуациях, но она делает то же самое.

  • 0
    Большое спасибо! Это именно то, что мне нужно здесь. Также спасибо P.Salmon за то же решение!
2
    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)
1

Вы можете использовать самообучение (интуитивно понятное):

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;
  • 0
    Хороший ответ. Обратите внимание, что для DISTINCT также потребуется этап агрегирования.
  • 0
    Ах хорошо! Спасибо! Таким образом, другое решение будет иметь небольшое преимущество в производительности?
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню