mysql查询输出已购买用户购买的任何相同型号的人数

时间:2015-03-07 18:05:11

标签: mysql

purchased_models

user_id model_id
1   1
1   4
1   9
1   3
2   3
2   2
2   7
2   4
3   9
3   6

3   1
3   5
4   8
4   7
4   9
4   1
5   8
5   9

使用上表,编写查询以输出其中列为user_id的表,用户已购买的模型数以及购买了相关用户购买的任何相同型号的人数。结果应如下所示:

结果

user_id models_purchased    users_purchasing_same_models
1                  4           4
2                  4           2
3                  4           3
4                  4           4
5                  2           3

得到前两个:

SELECT
                    DISTINCT user_id,
                    COUNT(DISTINCT model_id)
                FROM 
                    purchased_models
                GROUP BY user_id

,但遇到第三个问题。任何帮助将不胜感激。谢谢!

2 个答案:

答案 0 :(得分:1)

执行此操作的一种方法是使用相关子查询,该子查询计算已购买外部作用域中引用的用户所购买的任何模型的不同用户数:

select 
    t1.user_id, 
    count(distinct t1.model_id) models_purchased, 
    (
       select count(distinct user_id)
       from purchased_models t2 
       where t2.model_id in (
          select model_id 
          from purchased_models 
          where user_id = t1.user_id 
            and t2.user_id <> t1.user_id
       )
    ) users_purchasing_same_models 
from purchased_models t1
group by t1.user_id
order by t1.user_id

答案 1 :(得分:0)

我会亲自尝试自我加入表和条件总和,如下所示:

SELECT
    a.user_id AS Id,
    SUM(CASE WHEN a.user_id = b.user_id AND a.model_id=b.model_id THEN 1 ELSE 0 END) AS ModelCount,
    SUM(CASE WHEN a.user_id != b.user_id AND a.model_id=b.model_id THEN 1 ELSE 0 END) AS Others
FROM purchased_models AS a
LEFT OUTER JOIN purchased_models AS b
ON TRUE
GROUP BY a.user_id