2017-08-16 57 views
0

的我试图指望谁在我们的2个应用1是不活动的用户数量。SQL查询来计算用户与左连接2台

我有2个表 - Users表和User_Applications表,其中有包含用户ID,应用程序ID和布尔值的行,无论它们是活动还是非活动。

如果用户被赋予访问应用程序,一个行被添加到User_Applications。所以,如果他们有权访问应用程序A和应用程序B,则有2行。如果他们只能访问应用程序A,则只有一行。

据推测,如果User_Applications存在关于应用B没有记录,那么该用户是无效的。如果不存在任何记录都在User_Applications用户,他们是在这两个应用程序A和B.应用

不活跃试想一个加入这样的:

| user_id | app_id | active | 
|---------|--------|--------| 
| 1  | 'A' | false | 
| 1  | 'B' | true | 
| 2  | null | null | 
| 3  | 'B' | true | 

如果我计算用户的数量谁在A中不活动,用户1,2和3全部不活动。然而,我的SQL脚本只能算作用户喜欢1和2.不计的用户喜欢3.怎样包括用户喜欢在我的查询#3?

我写这个SQL脚本来算不活动的用户的应用程式数量:

SELECT COUNT(*) FROM Users u 
LEFT JOIN User_Applications s on u.user_id = s.user_id 
WHERE (s.app_id = 'A' OR s.app_id IS NULL) 
AND (s.active = false OR s.active IS NULL); 

回答

0

下面是你在找什么码?

SELECT COUNT(*) FROM Users u 
LEFT JOIN User_Applications s on u.user_id = s.user_id 
WHERE (s.app_id = 'A' OR s.app_id = 'B' OR s.app_id IS NULL) AND (s.active = false OR s.active IS NULL); 
0

只需使用条件COUNT(),而是试图算活跃APP多少有每个用户。然后,你指望谁不有2个活动的应用程序

SELECT COUNT(*) 
FROM (
    SELECT COUNT(CASE WHEN s.active THEN 1 ELSE NULL END) 
    FROM Users u 
    LEFT JOIN User_Applications s 
     ON u.user_id = s.user_id 
    GROUP BY user_id 
    HAVING COUNT(CASE WHEN s.active THEN 1 END) < 2 
) T 

我补充ELSE NULL,但对于ELSE的默认值,这样也行,如果你不加它

COUNT()不计空。因此,如果用户没有权限的应用程序,该left join回报null并不会计数,如果用户不活动的情况下也将返回null,不会算

所以,你会发现那些谁不有2级活跃的应用程序。

0

计数用户提供最多1活性应用从( 'A', 'B')列表

SELECT COUNT(*) FROM Users u 
LEFT JOIN ( 
    SELECT user_id, COUNT(*) nActive 
    FROM User_Applications 
    WHERE app_id IN ('A' , 'B') AND active 
    GROUP BY user_id 
) s on u.user_id = s.user_id 
WHERE (s.nActive <= 1 OR s.nActive IS NULL) 
+0

应该检查'<= 1' https://stackoverflow.com/questions/4970314/can -count,不断回报空 –