我有这张桌子:
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提前和抱歉我的英语。
答案 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 distinct
与group 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`
基本上我们将表格与自身联系起来,将具有相同idm
和date_play
的记录配对,但不是相同的id
。这将具有匹配具有相同用户和日期时间的任何两个记录的效果。然后,我们按用户对结果进行分组,这样您就不会多次列出相同的用户ID。
Gordon Linoff和tadman的建议让我得到了更有效的查询(对他们有信心)
SELECT t.`idm`
FROM mytable t
GROUP BY t.`date_play`
HAVING COUNT(t.`id`)>1