@zxcursed

Как сделать выборку?

Есть база со структурой:
user_id	| value_id	| amount	| created_at	| updated_at
1	| 22		| 1		| 2022-02-02	| 2022-02-02
1	| 23		| 2		| 2022-02-02	| 2022-02-02
1	| 23		| 1		| 2022-02-02	| 2022-02-02
2	| 22		| 3		| 2022-02-02	| 2022-02-02
2	| 22		| 4		| 2022-02-02	| 2022-02-02
2	| 22		| 1		| 2022-02-02	| 2022-02-02
3	| 24		| 3		| 2022-02-02	| 2022-02-02
3	| 24		| 3		| 2022-02-02	| 2022-02-02


Надо селектнуть отсюда записи, где user_id имеет value_id = 22 и value_id = 23, а так же имеет value_id = 23 ДВА и более раз. То есть вытащить user_id 1 в данном случае. Я понимаю, что первое условие через JOIN можно сделать, но как добавить проверку, что value_id = 23 два и более раз имеется?
Мой запрос сейчас выглядит так:
SELECT * FROM tbl T1 JOIN tbl T2 ON T1.user_id= T2.user_id AND T2.value_id= 22 WHERE T1.value_id= 23;
  • Вопрос задан
  • 81 просмотр
Пригласить эксперта
Ответы на вопрос 2
ThunderCat
@ThunderCat Куратор тега MySQL
{PHP, MySql, HTML, JS, CSS} developer
https://www.w3resource.com/sql/aggregate-functions...

Тупое решение "в лоб" будет что-то типа
селект * 
фром тбл 
вэа юзер_ид ин(
          селект юзер_ид 
          фром тбл 
          вэа валуе_ид = 23
          груп бай валуе_ид
          хэвинг каунт(*) = 2
) т1
энд валуе_ид = 22
Ответ написан
rozhnev
@rozhnev Куратор тега MySQL
Fullstack programmer, DBA, медленно, дорого
INTERSECT
select user_id
from t
where value_id = 22
group by user_id
having count(*) = 1
intersect
select user_id
from t
where value_id = 23
group by user_id
having count(*) = 2

https://sqlize.online/sql/mysql80/e91e6281dfc403d7...

with count_values as (
    select user_id, value_id, count(*) cnt
    from t
    group by user_id, value_id
) 
select user_id from count_values where value_id = 22 and cnt > 0
intersect
select user_id from count_values where value_id = 23 and cnt > 1


https://sqlize.online/sql/mysql80/6fbb4ed9d8a103b3...
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы