I want to know all of the users that have bought all the specified products
Table items_list (which can evolve, so the number of entries can not be used to query)
+---------+
| item_id |
+---------+
| 101 |
| 200 |
| 512 |
+---------+
Table orders
+---------+---------+
| item_id | user_id |
+---------+---------+
| 101 | 1 |
| 200 | 1 |
| 512 | 1 |
| 200 | 2 |
| 512 | 2 |
| 101 | 3 |
| 200 | 3 |
+---------+---------+
When I do
SELECT * FROM orders o WHERE o.item_id IN (SELECT i.item_id FROM items_list i) GROUP BY user_id
I got all the users
I want only user_id 1, who has bought everything from items_list
Well one of the methods can be grouping my user_id
and then checking DISTINCT item_id
:
SELECT
*
FROM
orders o
GROUP BY o.`user_id`
HAVING COUNT(DISTINCT(o.item_id)) = (SELECT COUNT(*) FROM items_list)
COUNT(DISTINCT(o.item_id))
will give you All distinct items for the user and then (SELECT COUNT(*) FROM items_list)
will give you the count of items in your table. Checking if the count matches should give you the result you are expecting
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.