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

时间:2011-01-31 18:42:25

标签: mysql

不确定如何最好地说出来,所以请耐心等待。我的表(简化)如下:

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

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

对于背景,这是一个网站搜索表,我想知道用户搜索某些内容的所有实例,然后再次搜索(可能是因为他们之前的搜索没有提供他们正在寻找的结果)。

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

修改 我对表中所有用户的搜索返回结果感兴趣,不仅仅是用户#5,而且还可以在不输入实际时间的情况下进行搜索。时间戳不应该是手动输入的内容,而是应该找到每个用户在10分钟内完成的行。

2 个答案:

答案 0 :(得分:1)

这应该在时间限制内为您提供所有用户和他们的搜索次数:

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"

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

答案 1 :(得分:1)

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 <)