查找至少具有每个项目之一的用户

时间:2019-05-19 01:26:40

标签: mysql sql

例如,我有一个名为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个唯一项:camerasmartphonesmartwatchglucose monitor

预期结果:

由于user_id:2至少有一项,结果将是:

user_id 
2

这是我到目前为止所尝试的,但是,如果项目列表从4个唯一项目更改为3个唯一项目,我认为它不再起作用。

SELECT *
FROM Information
GROUP BY Information.user_id
having count(DISTINCT item) >= 4

3 个答案:

答案 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.