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