Mysql 如何选择日期间隔

Mysql 如何选择日期间隔,mysql,Mysql,这是我的桌子: +------+--------+-------------------+ | user | item | date_time | | 10 | 01 | 10-10-10 20:10:05 | | 10 | 02 | 10-10-10 20:10:10 | | 10 | 03 | 10-10-10 20:10:10 | | 20 | 02 | 10-10-10 20:15:10 | | 20 | 0

这是我的桌子:

+------+--------+-------------------+
| user | item   | date_time         |
|   10 |     01 | 10-10-10 20:10:05 |
|   10 |     02 | 10-10-10 20:10:10 |
|   10 |     03 | 10-10-10 20:10:10 |
|   20 |     02 | 10-10-10 20:15:10 |
|   20 |     02 | 10-10-10 20:20:10 |
|   30 |     10 | 10-10-10 20:01:10 |
|   30 |     20 | 10-10-10 20:01:20 |
|   30 |     30 | 10-10-10 20:05:20 |
+------+--------+-------------------+
我想执行一个查询,返回一个用户,该用户在1分钟的时间间隔内获取了多个项目,结果如下:

+------+--------+-------------------+
| user | item   | date_time         |
|   10 |     01 | 10-10-10 20:10:05 |
|   10 |     02 | 10-10-10 20:10:10 |
|   10 |     03 | 10-10-10 20:10:10 |
|   30 |     10 | 10-10-10 20:01:10 |
|   30 |     20 | 10-10-10 20:01:20 |
+------+--------+-------------------+
我该怎么做

编辑 如果我只想显示在此输出上出现2次或更多次的用户

例如:

+------+--------+-------------------+
| user | item   | date_time         |
|   10 |     01 | 10-10-10 20:10:05 |
|   10 |     02 | 10-10-10 20:10:10 |
|   10 |     03 | 10-10-10 20:10:10 |
+------+--------+-------------------+

您必须将表自身连接起来,让我们调用表别名T1和T2。然后写一个WHERE子句,只过滤T1.user等于T2.user且T1.date_时间和T2.date_时间之差的绝对值小于一分钟的行

但问题是每一行都会被选中,因为您的表上没有主键,因此无法检测行何时与自身连接。创建一个主键一个自动编号序列可以正常工作,并在WHERE子句中添加一个条件,表示T1.id T2.id

因此,以未经测试的代码形式:

SELECT *
FROM stuff T1, stuff T2
WHERE T1.user = T2.user
  AND ABS(UNIX_TIMESTAMP(T1.date_time) - UNIX_TIMESTAMP(T2.date_time)) < 60
  AND T1.id <> T2.id;
让我们试试这个:

SELECT * FROM myTable  
JOIN (SELECT MAX(date_time) AS maxi, MIN(date_time) AS mini, user AS uid FROM myTable GROUP BY uid) AS otherTable  
ON date_time<=maxi AND date_time>=mini AND user = uid AND UNIX_TIMESTAMP(maxi) - UNIX_TIMESTAMP(mini) < 60  
GROUP BY uid, date_time

是的,您需要按照@Will的建议添加主键id

要获取每个项目一次且仅一次,而不管在1分钟窗口内有多少个匹配项,请尝试子查询而不是完全联接:

Select user,item,date_time from my_table t1
  where id in (select t2.id from my_table t2,my_table t3
      where t2.id <> t3.id and t2.user = t3.user 
           and abs(t2.date_time - t3.date_time) < 60)

当用户在1分钟窗口内购买超过2个项目时,返回的行太多。对于给定的示例数据,它返回8行,而不是5行。为每个用户选择最大和最小事务时间并加入maxi mini>60的方法不起作用。在测试数据上运行此操作,它会为用户20拾取事务,并忽略用户10。@David:你说得对,我对操作员的看法是错误的。。。我已经编辑了我的答案来改变这一点,但这是行不通的,或者用样本数据试试。您无法通过查看给定用户的最大和最小值来解决此问题:例如,用户30在1分钟内有2个事务,但在这个问题上,最大-最小值>60.+1可提供良好的测试数据和预期结果。您是否可以使用相同的用户,项目和日期\u时间,或者您可以计算日期\u时间对于用户和项目组合是唯一的?一个用户永远不会得到两个或更多项目非常好!这个很好用!但是,现在我需要这个结果,只显示在这种情况下有2个或更多iTen的用户,输出示例:--------------------用户|项|日期|时间| 10 | 01 | 10-10-10 20:10:05 | 10-10-10 20:10:10 | 10 | 03 | 10-10-10:20:10 |-------------------
select * from my_table where user in 
    (select user from temp1 group by user having count(*) > 2);