如果插入在同一秒内,则获取数据

时间:2017-08-24 14:53:41

标签: 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

我想确定用户是否在同一秒内有多个插入。在描述的情况下,我想获得5的用户ID。

我试过这样:

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`
你能帮帮我吗? Thx提前和抱歉我的英语。

2 个答案:

答案 0 :(得分: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 distinctgroup by一起使用:

select distinct idm
from t
group by idm, date_play
having count(*) >= 2;

(我只提到这一点,因为这是我所知道的唯一一种问题,select distinct使用group by是有道理的。)

如果您想要复制的所有,我会转而使用exists

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

这应该具有合理的性能,索引在(idm, date_play, id)

答案 1 :(得分:0)

如果您的表名为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`

基本上我们将表格与自身联系起来,将具有相同idmdate_play的记录配对,但不是相同的id。这将具有匹配具有相同用户和日期时间的任何两个记录的效果。然后,我们按用户对结果进行分组,这样您就不会多次列出相同的用户ID。

编辑:

Gordon Linoff和tadman的建议让我得到了更有效的查询(对他们有信心)

SELECT t.`idm`
FROM mytable t
GROUP BY t.`date_play`
HAVING COUNT(t.`id`)>1