繁体   English   中英

mySQL为每个user_id从单个表中选择行,这些行在时间戳中接近

[英]mySQL select rows from a single table for each user_id which are close in timestamp

不确定如何最好地表达这个词,所以请忍受我。 我的表(简体)如下:

  • id - 整数 - 自动增量
  • user_id - 整数
  • timestamp - 日期时间

我需要的功能是查询此表并选择每个user_idtimestamp列在预定义时间范围内的所有记录(可能是任意的,但可以说10分钟)。因此,例如,我想知道是否存在是假设的user_id 5的条目,位于“ 2011-01-29 03:00:00”,然后是“ 2011-01-29 03:02:00”,但如果用户在“ 2011-01-29”搜索一次,则不是03:00:00”,然后下一个“ 2011-01-29 05:00:00”。 这还需要捕获实例,其中用户搜索两次以上,每次都在上一次的时间范围内。

对于背景,这是一个站点搜索表,我想知道用户搜索某事然后再次搜索的所有实例(大概是因为他们以前的搜索没有提供他们想要的结果)。

我知道这可能比我想像的要简单,但是我似乎无法弄清楚。 如果需要,我可以澄清或提供其他信息。 谢谢!

编辑:我感兴趣的是搜索表中所有用户的返回结果,不仅仅是用户#5,还有搜索而没有输入实际时间。 时间戳记不应是手动输入的,而应由每个用户查找彼此相距10分钟以内的行。

这应该为您提供所有用户及其在时限内的搜索次数:

SELECT user_id, COUNT(*) AS cnt FROM table 
   WHERE timestamp BETWEEN "2011-01-29 03:00:00" AND "2011-01-29 03:02:00" 
   GROUP BY user_id
   ORDER BY user_id

这将显示仅由user_id #5进行的搜索次数:

SELECT COUNT(*) AS cnt FROM table 
   WHERE user_id=5 
   AND timestamp BETWEEN "2011-01-29 03:00:00" AND "2011-01-29 03:02:00"

根据实际DB,语法可能会有所不同,尤其是传递给BETWEEN条件的日期格式。

SELECT distinct t1.user_id, t1.another_field, t1.another_field
FROM
    table t1,
    table t2
WHERE
t1.user_id = t2.user_id
AND abs(timestampdiff(MINUTE, t1.timestamp, t2.timestamp)) < 10

如果您想进一步限制结果,可以添加

AND t1.user_id = any_number (or IN or between, etc)

要限制日期范围添加,

AND t1.timestamp BETWEEN A and B (or > or <)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM