Mysql 插入前我如何数数?
我有这张桌子:Mysql 插入前我如何数数?,mysql,sql,Mysql,Sql,我有这张桌子: // cookies +---------+-------------------------+------------------+------------+ | id | email | cookie | date_time | +---------+-------------------------+------------------+------------+ | int(11) | varc
// cookies
+---------+-------------------------+------------------+------------+
| id | email | cookie | date_time |
+---------+-------------------------+------------------+------------+
| int(11) | varchar(50) | varchar(128) | int(11) |
+---------+-------------------------+------------------+------------+
| 1 | jack_2009@gmail.com | ojer0f934mf2... | 1467204523 |
| 2 | peter.zm@yahoo.com | ko4398f43043... | 1467205521 |
| 3 | matrix_john23@gmail.com | 34fjkg3j438t... | 1467205601 |
| 4 | peter.zm@yahoo.com | 0243hfd348i4... | 1467206039 |
+---------+-------------------------+------------------+------------+
我的问题是:
INSERT INTO cookies VALUES(NULL, $email, $hash, unix_timestamp())
现在,在插入之前,我需要检查以下条件:
行数(针对特定用户)应小于:
每小时5
每天10
每月50
总计100
我只需查看最后一个案例:
INSERT INTO cookies(id, email, cookie, date_time)
SELECT NULL, $email, $hash, unix_timestamp()
FROM cookie
WHERE email = $email AND
100 >= ( SELECT count(1) FROM cookies WHERE email = $email )
那么,如何添加其他条件呢?您可以使用存储过程,并在其中处理此问题。将插入值传递到此存储过程
DELIMITER $$
CREATE PROCEDURE `sp_test`(id int, email varchar(45), cookie varchar(45), date_time datetime)
BEGIN
DECLARE countval INT;
SET countval = (SELECT sum(1) FROM cookies WHERE email = $email );
IF (countval is null) THEN
// do something
ELSEIF (countval>10) THEN
// do something like that
ELSE
// do something
END IF;
// insert query
END $$
DELIMITER ;
我不确定
(在组员中)是否应该是=
,但我认为这会满足您的要求
INSERT INTO cookies(id, email, cookie, date_time)
SELECT NULL, $email, $hash, unix_timestamp()
FROM cookie
WHERE email = $email
AND NOT EXISTS (
SELECT COUNT(CASE WHEN date_time > UNIX_TIMESTAMP(now() - INTERVAL 1 HOUR)
THEN 1 ELSE NULL END) AS rowsInLastHour
, COUNT(CASE WHEN date_time > UNIX_TIMESTAMP(now() - INTERVAL 1 DAY)
THEN 1 ELSE NULL END) AS rowsInLastDay
, COUNT(CASE WHEN date_time > UNIX_TIMESTAMP(now() - INTERVAL 1 MONTH)
THEN 1 ELSE NULL END) AS rowsInLastMonth
, COUNT(1) AS rowsEver
FROM cookie
WHERE email = $email
HAVING rowsInLastHour > 5
OR rowsInLastDay > 10
OR rowsInLastMonth > 50
OR rowsEver > 100
)
;
- 它通过使用
查找上一个小时| day |月的开始时间,并计算在这些开始时间之后发生的值,来统计在上一个小时| day | month中具有日期|时间值的所有行(对于电子邮件)李>now()-INTERVAL 1 hour | day | month
- 然后,它使用
仅产生单一结果(聚合,例如HAVING
,没有关联的COUNT
子句,总是产生一行),前提是超出了您指定的任何限制GROUP BY
- 如果没有结果,
将返回true(因为没有超过限制)不存在
编辑:根据问题的需要,更新比较以使用单位时间戳。id是否对应于唯一的用户?您可以使用存储过程并在其中处理this@vkp
id
列是PK(因此它是唯一的)。但是email
列不是唯一的。您需要存储过程或触发器。哪个“小时”,哪个“天”,等等?您可以在“call sp_test(1,“sasa”,“wew”,3232)”中调用它。“好的,这个查询只检查最后一个或任何一个?最后一个,我将在编辑中添加详细信息/解释。正如您在问题中看到的,unix_time列的值是秒的整数。但是now()-INTERVAL…
返回日期时间格式。那么你认为这样行吗<代码>日期时间>现在()-间隔1小时哦,我几乎忽略了这一点;您应该能够执行date\u time>UNIX\u TIMESTAMP(now()-INTERVAL 1 HOUR)
,对于日版本和月版本也是如此。感谢您的更新。请您告诉我,我可以用不在
而不是不存在
吗?