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()
    ,将计算的日期转换为历元秒。谢谢你拿这个。