我有一个包含一些用户数据的表:
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 BY
COALESCE
> 这两列并且不使用 UNION
关于mysql - 获取特定日期的两个不同列的唯一值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8843363/