mysql - 获取特定日期的两个不同列的唯一值

标签 mysql sql

我有一个包含一些用户数据的表:

user_id | guest_id | time_seen | action_performed | longitude | latitude
-------------------------------------------------------------------------  
 123     | NULL     | Jan 10    | search           | -127      | 35  
 152     | NULL     | Dec 10    | login            | -128      | 34   
 172     | NULL     | Dec 15    | search           | -125      | 35   
 123     | NULL     | Jan 10    | login            | -127      | 35   
 NULL    | GUEST1   | Jan 10    | search           | -127      | 35   
 NULL    | GUEST1   | Dec 10    | search           | -127      | 35   
 NULL    | GUEST2   | Jan 10    | browse           | -127      | 35   
 NULL    | GUEST3   | Dec 10    | browse           | -127      | 35   

我需要获取给定时间范围内唯一用户 ID 和访客 ID 的列表。同一行永远不会同时具有有效的用户 ID 和有效的访客 ID。我当前使用的查询是:

SELECT * 
    FROM stats 
    WHERE time_seen >= "2011-12-1 00:00:00" 
      AND time_seen < "2012-1-1 00:00:00" 
    GROUP BY guest_id 
UNION 
SELECT * 
    FROM stats 
    WHERE time_seen >= "2011-12-1 00:00:00" 
      AND time_seen < "2012-1-1 00:00:00" 
    GROUP BY user_id;

所以我希望检索:

user_id | guest_id | time_seen | action_performed | longitude | latitude
-------------------------------------------------------------------------  
 152     | NULL     | Dec 10    | login            | -128      | 34   
 172     | NULL     | Dec 15    | search           | -125      | 35 
 NULL    | GUEST1   | Dec 10    | search           | -127      | 35
 NULL    | GUEST3   | Dec 10    | browse           | -127      | 35      

截至目前,真实表包含大约 1100 万个条目,并且每天都在增长,因此显然我有兴趣使查询尽可能高效。这个查询似乎有点次优(除非有内部优化),因为我每次都执行相同的查询,然后按不同的事物对其进行分组。

有什么方法可以改进我的查询,或者这是我能做的最好的事情吗?

回答以下问题:

日期确实有时间戳值,我只是想为了帖子的目的进行简化。

user_id 值和 guest_id 值之间没有重叠。

最佳答案

如果user_id值和guest_id值之间没有重叠,那么您可以GROUP BYCOALESCE > 这两列并且不使用 UNION

关于mysql - 获取特定日期的两个不同列的唯一值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8843363/

相关文章:

php - 表单上的 strpos 错误

php - 如何使用类似和多个无序值进行 SQL 查询

php - mysql内置函数去除标签

php - 为什么这会不断返回 PHP 错误警告 : mysql_num_rows() expects parameter 1 to be resource

c# - 根据列和某个对象的字段检查 SQL 表中是否存在对象

当列包含 utf-8 字符时 MySQL 查询返回错误数据

mysql - 使 Zend\Db (zf2) 包含在子句之间

mysql - 基于来自另一个字段的 LIKE 构建 MySQL 表

sql - 检查一个或多个 id 是否在 json 字符串中

sql - 在表中创建仅包含自动生成字段的行 - SQL