如果用户在mysql中完成所有课程,则对用户进行计数

时间:2019-05-04 10:24:44

标签: mysql

我有2个表5r63P4FZ_users5r63P4FZ_2_learndash_user_activity,在此表5r63P4FZ_2_learndash_user_activity中,所有课程的状态都将显示在这里,这里有ID 36位用户,已分配2门课程,其activity_id10519,用户ID = 36的这2门课程,我只想计算该用户课程完成意味着其activity_status = 1,但是现在在我的表格中,其状态分别为10,这意味着用户没有完成这两个课程,因此我想将该用户计为0,为此我添加了查询,但是它给了我1而不是0,有人可以帮我解决此问题,这是我的表和查询

5r63P4FZ_users 

enter image description here

5r63P4FZ_2_learndash_user_activity

enter image description here

Query : 

SELECT COUNT(DISTINCT u.ID) as total
FROM 5r63P4FZ_users AS u
INNER JOIN 5r63P4FZ_2_learndash_user_activity as ua 
ON u.ID = ua.user_id AND ua.activity_status = "1" AND ua.activity_type = 'course'
WHERE u.ID = 36

3 个答案:

答案 0 :(得分:0)

SELECT COUNT(*) FROM (
    SELECT DISTINCT 5r63P4FZ_users.user_id FROM
        5r63P4FZ_users INNER JOIN 5r63P4FZ_2_learndash_user_activity
        ON 5r63P4FZ_users.user_id = 5r63P4FZ_2_learndash_user_activity.user_id
        AND activity_status = 1 and activity_type = 'course'
        WHERE 5r63P4FZ_users.user_id NOT IN (
            SELECT DISTINCT user_id FROM 5r63P4FZ_2_learndash_user_activity
                WHERE activity_status = 0 and activity_type = 'course'
            )
    )
;

答案 1 :(得分:0)

    mysql> select * from tab;
+------+------+------+
| uid  | cid  | act  |
+------+------+------+
|    1 |    1 |    1 |
|    2 |    1 |    1 |
|    1 |    2 |    0 |
|    3 |    2 |    1 |
|    3 |    1 |    1 |
+------+------+------+
5 rows in set (0.00 sec)

mysql> select uid, min(act) from tab group by uid having min(act) > 0;
+------+----------+
| uid  | min(act) |
+------+----------+
|    2 |        1 |
|    3 |        1 |
+------+----------+
2 rows in set (0.00 sec)

uid-用户ID,CID-课程ID,操作-活动

答案 2 :(得分:0)

您不需要加入两个表。
您想要的所有数据都存在于表5r63P4FZ_2_learndash_user_activity中。
此查询:

select user_id
from 5r63P4FZ_2_learndash_user_activity
where activity_type = 'course'
group by user_id
having sum(activity_status) = count(*)

返回已完成所有课程的所有user_id位用户。
如果您只想计算它们:

select count(*) counter from (
  select user_id
  from 5r63P4FZ_2_learndash_user_activity
  where activity_type = 'course'
  group by user_id
  having sum(activity_status) = count(*)
) t

如果您仅对user_id = 36感兴趣,则可以在上述查询中添加WHERE子句:

where t.user_id = 36

或者您可以使用此:

select 
  case 
    when exists (
      select 1 from 5r63P4FZ_2_learndash_user_activity
      where user_id = 36 and activity_type = 'course' and activity_status = 0 
    ) then 0
    else 1
  end counter

假设user_id = 36至少有1门课程。