Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/55.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 插入前我如何数数?_Mysql_Sql - Fatal编程技术网

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
    )
;
  • 它通过使用
    now()-INTERVAL 1 hour | day | month
    查找上一个小时| day |月的开始时间,并计算在这些开始时间之后发生的值,来统计在上一个小时| 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)
,对于日版本和月版本也是如此。感谢您的更新。请您告诉我,我可以用
不在
而不是
不存在
吗?