【问题标题】:SQL Multiple counts with 3 tablesSQL 多重计数与 3 个表
【发布时间】:2019-01-29 10:46:34
【问题描述】:

我正在使用 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)

【问题讨论】:

  • 更新您的问题,添加表格架构、适当的数据样本和预期结果

标签: mysql join count


【解决方案1】:

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

在您的情况下,创建 VIEW 组合表 table1table2 可能是有意义的。

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

然后基于该视图构建查询,INNER JOIN (JOIN 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

【讨论】:

  • 非常感谢!
猜你喜欢
  • 1970-01-01
  • 2013-03-14
  • 2020-09-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-06-24
  • 2012-06-13
相关资源
最近更新 更多