【问题标题】:How to obtain distinct values based on another column in the same table?如何根据同一张表中的另一列获取不同的值?
【发布时间】:2019-05-13 14:01:17
【问题描述】:

我不知道如何正确表达标题,如果一开始不清楚,请见谅。

我想做的是找到登录到特定页面的用户,而不是其他页面。

我的表是这样的:

Users_Logins
------------------------------------------------------
| IDLogin | Username | Page  | Date       | Hour     |
|---------|----------|-------|------------|----------|
| 1       | User_1   | Url_1 | 2019-05-11 | 11:02:51 |
| 2       | User_1   | Url_2 | 2019-05-11 | 14:16:21 |
| 3       | User_2   | Url_1 | 2019-05-12 | 08:59:48 |
| 4       | User_2   | Url_1 | 2019-05-12 | 16:36:27 |
| ...     | ...      | ...   | ...        | ...      |
------------------------------------------------------

如您所见,用户 1 登录了 Url 1 和 2,但用户 2 仅登录了 Url 1。

我应该如何查找在特定时间段内登录过 Url 1 但从未登录过 Url 2 的用户?

提前致谢!

【问题讨论】:

    标签: mariadb heidisql


    【解决方案1】:

    稍后我会尝试改进您的问题的标题,但目前,这就是我完成您所要求的内容的方式:

    查询:

    select distinct username from User_Logins  
    where page = 'Url_1'  
    and username not in  
        (select username from User_Logins  
        where Page = 'Url_2')  
    and date BETWEEN '2019-05-12' AND '2019-05-12'  
    and hour BETWEEN '00:00:00' AND '12:00:00';
    

    返回:

    User_2
    

    评论:

    1. 我基本上是使用子查询来过滤掉你不关心的用户名。 :)
    2. 时间范围仅得到 1 个结果,您可以通过删除查询第一行中的“distinct”进行测试。如果您随后从查询中删除时间范围,您将获得 2 个结果。

    【讨论】:

      【解决方案2】:

      您可以使用group by username 执行此操作,并在HAVING 子句中应用条件:

      select username 
      from User_Logins  
      where
        date between '..........' and '..........'  
        and 
        hour between '..........' and '..........';
      group by username
      having 
        sum(page = 'Url_1') > 0
        and 
        sum(page = 'Url_2') = 0
      

      用您想要的日期/时间间隔替换这些点。

      【讨论】:

      • 顺便说一句,我回答其他评论者说他们的解决方案有效,但这实际上也有效。非常感谢!
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-02
      • 1970-01-01
      • 2021-03-31
      相关资源
      最近更新 更多