具有3个表的SQL多重计数

时间:2019-01-29 10:46:34

标签: mysql join count

我正在使用SQL构建程序(COBOL),以跟踪用户特殊时间的记录时间。

我有3张桌子:

table 1 - user logged time
table 2 - user logged time
table 3 - user profile

同一用户不在表1和表2上,所有用户都在表3上。

我必须计算有多少用户在上次登录时使用配置文件X: 不到一个小时 1小时至5小时之间 超过5小时。

我找到了一种使用表1和表3进行1计数的方法:

`SELECT COUNT (DISTINCT A.user)                                                           
 FROM table1 A                         
LEFT JOIN table3 B                        
   ON B.user = A.user                             
WHERE B.profile = 'X'                                                      
  AND A.HTIMEST = (SELECT MAX(HTIMEST)                    
                     FROM table1 A     
                    WHERE B.user = A.user)                     
  AND A.time BETWEEN 0 AND 1  `     

这将意味着在一个程序中进行大量查询。

如果您能提供任何帮助,我将非常感谢。

谢谢。

Table1:
       User  TimeLog     Timestamp
        1      0,5       2019-01-01
        1       6        2018-11-31
        4       2        2018-12-31

 Table2:
       User  TimeLog     Timestamp
        2      0,5       2019-01-01
        3       6        2018-11-31
        5       2        2018-12-31

 Table3:
       User  Profile    
        1        X     
        2        X      
        3        Z
        4        X      
        5        Z

预期结果:

Time loged   Count
<1h            2 (User 1 e User 2)
>1h -<5h       1 (User 4) (User 5 doesn't have the right profile)
>5h            0 (User 3 doesn't have the right profile, and user 1 has more 
                   recent data)

1 个答案:

答案 0 :(得分:0)

您可以使用UNION将多个选择语句组合为一个结果。

在您的情况下,创建一个VIEW合并表table1table2的方法可能很有意义。

CREATE VIEW logs AS
    SELECT user, timelog, timestamp FROM table1
    UNION ALL
    SELECT user, timelog, timestamp FROM table2;

然后基于该视图构建查询,INNER JOINJOIN reference)个人资料为“ X”的用户,INNER JOIN一个查询,该查询获得每个用户的最高时间戳,并使用CASE语句(基本上是if / else)来确定时间类别。根据案例陈述进行分组并统计用户。

SELECT
    CASE
        WHEN l.timelog < 1 THEN '<1h'
        WHEN l.timelog <= 5 THEN '>=1h - <=5h'
        ELSE '>5h'
    END AS time_logged,
    COUNT(l.user)
FROM
    logs l
    INNER JOIN table3 u ON
        l.user = u.user
        AND u.profile = 'X'
    INNER JOIN (
        SELECT
            user,
            MAX(timestamp) AS timestamp
        FROM
            logs
        GROUP BY
            user
        ) m ON
            l.user = m.user
            AND l.timestamp = m.timestamp
GROUP BY
    CASE
        WHEN l.timelog < 1 THEN '<1h'
        WHEN l.timelog <= 5 THEN '>=1h - <=5h'
        ELSE '>5h'
    END;

DB Fiddle