Mysql 如何选择最后一天插入的所有行?
我有一张这样的桌子:Mysql 如何选择最后一天插入的所有行?,mysql,sql,Mysql,Sql,我有一张这样的桌子: // reset_password_emails +----+----------+--------------------+-------------+ | id | id_user | token | unix_time | +----+----------+--------------------+-------------+ | 1 | 2353 | 0c274nhdc62b9dc... | 1339412843 | |
// reset_password_emails
+----+----------+--------------------+-------------+
| id | id_user | token | unix_time |
+----+----------+--------------------+-------------+
| 1 | 2353 | 0c274nhdc62b9dc... | 1339412843 |
| 2 | 2353 | 0934jkf34098joi... | 1339412864 |
| 3 | 5462 | 3408ujf34o9gfvr... | 1339412894 |
| 4 | 3422 | 2309jrgv0435gff... | 1339412899 |
| 5 | 3422 | 34oihfc3lpot4gv... | 1339412906 |
| 6 | 2353 | 3498hfjp34gv4r3... | 1339412906 |
| 16 | 2353 | asdf3rf3409kv39... | 1466272801 |
| 7 | 7785 | 123dcoj34f43kie... | 1339412951 |
| 9 | 5462 | 3fcewloui493e4r... | 1339413621 |
| 13 | 8007 | 56gvb45cf3454g3... | 1339424860 |
| 14 | 7785 | vg4er5y2f4f45v4... | 1339424822 |
+----+----------+--------------------+-------------+
每行是一封电子邮件。现在我正在尝试对发送重置密码电子邮件进行限制。我的意思是一个用户可以实现每天3封电子邮件(不是更多)
因此,我需要一个查询来检查用户的历史记录中的电子邮件数量:
SELECT count(1) FROM reset_password_emails WHERE token = :token AND {from not until last day}
我如何实现这一点:
. . . {from now until last day}
实际上我可以这样做:
NOW()您可以使用from\u unixtime
函数转换unix\u时间
select r.*
from reset_password_emails r
where now() <= from_unixtime(r.unix_time) - interval '1' day
选择r*
从重置密码\u电子邮件\r
where now()表达式可以工作,但有3个问题:
编码方式意味着必须对每一行执行减法运算(性能命中)
因为您没有使用原始列值,所以无法在时间列上使用索引(如果存在)
看不清楚
试试这个:
unix_time > unix_timestamp(subdate(now(), interval '1' day))
这里,每个查询计算一次阈值datetime,因此上述所有问题都已得到解决
请看你所拥有的绝对完美NOW()“最后一天”是指“现在之前的24小时”还是“前一天的午夜到午夜”?波西米亚式的24小时前now@vkp实际上它并不完美,因为它需要每行计算一次(这是可以避免的)@波希米亚人..当你使用一个函数将unix_时间转换为时间戳时,这也需要对每一行的函数进行求值..正确吗?这仍然存在我的回答中提到的问题1和2是的,我知道。谢谢你指出这一点@Bohemian我只是想展示一种方法。好的,请注意,这个查询需要在(托克,unix\u time)
上有一个多列索引,或者在(令牌)
和(unix\u time)
列上有两个单独的索引?每个表访问只能使用一个索引,所以您需要多列索引。错误。。unix\u time
列的值是上表中的整数秒数。但是ubdate(now(),interval'1'day)
返回日期时间格式。所以你的方程式行不通。@Shafizadeh似乎是对的(你说的)。我想波希米亚人应该把他的条件扭曲成unix\u timestamp()
函数。@Shafizadeh好的。我想错了。我添加了一个调用unjx_tinestamp()
,将计算的日期转换为历元秒。谢谢你拿这个。