例如,我有一个名为Information
user_id | item
-------------------------
45 | camera
36 | smartphone
23 | camera
1 | glucose monitor
3 | smartwatch
2 | smartphone
7 | smartphone
2 | camera
2 | glucose monitor
2 | smartwatch
如何检查哪个user_id至少有一项?
以下各项不是一成不变的,有时可能会有所不同。但是,在此示例中,有4个唯一项:camera
,smartphone
,smartwatch
,glucose monitor
预期结果:
由于user_id:2至少有一项,结果将是:
user_id
2
这是我到目前为止所尝试的,但是,如果项目列表从4个唯一项目更改为3个唯一项目,我认为它不再起作用。
SELECT *
FROM Information
GROUP BY Information.user_id
having count(DISTINCT item) >= 4
答案 0 :(得分:3)
一种方法是将user_id
进行汇总,然后断言不同的item_id
计数与整个表中的总不同的item_id
计数相匹配。
SELECT
user_id
FROM Information
GROUP BY
user_id
HAVING
COUNT(DISTINCT item_id) = (SELECT COUNT(DISTINCT item_id) FROM Information);
答案 1 :(得分:1)
您可以尝试按计数和总计数使用self-join
SELECT t1.user_id
FROM (
SELECT user_id,COUNT(DISTINCT item) cnt
FROM T
GROUP BY user_id
) t1 JOIN (SELECT COUNT(DISTINCT item) cnt FROM T) t2
WHERE t1.cnt = t2.cnt
或exists
查询1 :
SELECT t1.user_id
FROM (
SELECT user_id,COUNT(DISTINCT item) cnt
FROM T
GROUP BY user_id
) t1
WHERE exists(
SELECT 1
FROM T tt
HAVING COUNT(DISTINCT tt.item) = t1.cnt
)
Results :
| user_id |
|---------|
| 2 |
答案 2 :(得分:0)
解决此问题的另一种方法是使用CTE和density_rank函数。 这也可以在MySQL上提供更好的性能。 Dense_Rank函数对用户中的每个项目进行排名。我计算不重复项目的数量,说选出不重复项目最多的用户。
ImportError: DLL load failed: The specified module could not be found.