MySQL查询按IP地址,用户ID和时间戳分组

时间:2019-03-06 16:36:24

标签: mysql sql

我正在寻找一种方法来对某个区域的两个日期之间的表中的所有记录进行计数。

查询必须考虑以下要求:

  • 同一天来自同一ip_from的多行(对于同一org_id)只能计为1。

我在mysql中有一个这样的表:

+--------+----------+--------------+-----------------+-----------------+------------+---------------------+
| org_id | org_name | user_id_from | auth_level_from |     ip_from     | region_org |      timestamp      |
+--------+----------+--------------+-----------------+-----------------+------------+---------------------+
|      1 | test1    | NULL         | NULL            | 123.456.789.012 | Antwerpen  | 2019-03-06 00:00:00 |
|      2 | test2    | 3            | 1               | 454.454.454.454 | NULL       | 2019-03-06 00:00:00 |
|      1 | test1    | 5            | 2               | 111.111.111.111 | Antwerpen  | 2019-03-05 10:00:00 |
|      1 | test1    | 5            | 2               | 111.111.111.111 | Antwerpen  | 2019-03-05 11:00:00 |
|      1 | test1    | 5            | 2               | 111.111.111.111 | Antwerpen  | 2019-03-05 12:00:00 |
|      1 | test1    | 100          | 1               | 999.999.999.999 | Antwerpen  | 2019-03-05 12:00:00 |
+--------+----------+--------------+-----------------+-----------------+------------+---------------------+

org_id列包含组织的ID,org_name包含名称。

User_id_from列包含已登录并查看配置文件页面的用户的user_id(匿名用户也可以查看此页面,因此可以为NULL)。如果用户已登录,则Auth_level_from会被填充,否则为NULL。

ip_from包含通过$ _SERVER ['remote_addr']登录的用户的IP地址(我知道可以更改,但是对于我的用例来说并不重要)。

Region_org包含组织所在的区域,请注意,一个组织可以位于多个区域中,在这种情况下,我将插入第二行,与之前的行完全相同,只是region_org有所不同。但也可以为NULL

最后一个时间戳跟踪插入事件的时间。

这是我的查询内容:

SELECT org_id, org_name, count(*) as total, DATE(timestamp) as date
FROM `org_profile_views_events`
WHERE region_org = 'antwerpen'
GROUP BY org_id, ip_from, DATE(timestamp)

但是它返回所有行的总数,在此示例中,它返回

org_id = 1
org_name = test1
total = 4
date = 2019-03-05

org_id = 1
org_name = test1
total = 1
date = 2019-03-06

org_id = 2
org_name = test2
total = 1
date = 2019-03-06

我希望它返回

org_id = 1
org_name = test1
total = 2
date = 2019-03-05

org_id = 1
org_name = test1
total = 1
date = 2019-03-06

org_id = 2
org_name = test2
total = 1
date = 2019-03-06

(由于同一IP于2019-03-05发生了3个事件,另一个IP发生了1个事件)

1 个答案:

答案 0 :(得分:1)

我认为您正在寻找count(DISTINCT ip_from)

SELECT org_id, org_name, count(distinct ip_from) as total, DATE(timestamp) as date
FROM `org_profile_views_events`
WHERE region_org = 'antwerpen'
GROUP BY org_id, org_name, DATE(timestamp)