Php 如果insert在同一秒内,则获取数据
我有这张桌子:Php 如果insert在同一秒内,则获取数据,php,mysql,sql,Php,Mysql,Sql,我有这张桌子: id idm date_play 1 5 2017-08-23 12:12:12 2 5 2017-08-23 12:12:12 3 6 2017-08-23 12:14:13 我想确定用户在同一秒内是否有多个插入。在案例描述中,我希望得到
id idm date_play
1 5 2017-08-23 12:12:12
2 5 2017-08-23 12:12:12
3 6 2017-08-23 12:14:13
我想确定用户在同一秒内是否有多个插入。在案例描述中,我希望得到用户id为5
我试着这样做:
SELECT `idm`, MAX(`s`) `conseq` FROM
(
SELECT
@s := IF(@u = `idm` AND (UNIX_TIMESTAMP(`date_play`) - @pt) BETWEEN 1 AND 100000, @s + 1, 0) s,
@u := `idm` `idm`,
@pt := UNIX_TIMESTAMP(`date_play`) pt
FROM table
WHERE date_play >= '2017-08-23 00:00:00'
AND date_play <= '2017-08-23 23:59:59'
ORDER BY `date_play`
) AS t
GROUP BY `idm`
你能帮我吗?提前谢谢,我的英语很抱歉。如果您的表名为mytable,以下内容应该可以使用:
SELECT t.`idm`
FROM mytable t INNER JOIN mytable t2
ON t.`idm`=t2.`idm` AND t.`date_play`=t2.`date_play` AND t.`id`!=t2.`id`
GROUP BY t.`idm`
基本上,我们将表本身连接起来,对具有相同idm和date_play但不具有相同id的记录进行配对。这将产生将任意两条记录与相同用户和datetime进行匹配的效果。然后,我们按用户对结果进行分组,这样您就不会多次列出相同的用户id
编辑:
Gordon Linoff和tadman的建议让我找到了这个可能更有效的查询方法
SELECT t.`idm`
FROM mytable t
GROUP BY t.`date_play`
HAVING COUNT(t.`id`)>1
假设您的日期精确到第二级,您可以通过一个聚合来实现这一点:
select idm
from t
group by idm
having count(*) > count(distinct date_play);
如果date_play有小数秒,则需要通过转换为字符串来删除这些小数秒
如果希望播放日期与重复日期相同,请执行以下操作:
select idm, date_play
from t
group by idm, date_play
having count(*) >= 2;
或者,对于IDM,您可以使用select distinct with group by:
我之所以提到这一点,是因为这是我所知道的唯一一种问题,即使用select distinct和group by有意义
如果要复制所有行,我将选择exists:
这应该在idm、date\u play、id上有一个合理的索引。为什么不在date\u play字段上分组,寻找COUNTid>1的人呢?大概idm就是你所说的用户。
select distinct idm
from t
group by idm, date_play
having count(*) >= 2;
select t.*
from t
where exists (select 1
from t t2
where t2.idm = t.idm and t2.date_play = t.date_play and
t2.id <> t.id
);