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