簡體   English   中英

如何選擇最后一天插入的所有行?

[英]How can I select all rows which have been inserted in the last day?

我有這樣一張桌子:

// 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() <= (unix_time + 86400) ..但我想通過使用interval有一個更好的方法。 誰能告訴我那是什么意思?

你的表達方式有效,但有3個問題:

  1. 你編碼它的方式意味着必須對每一行執行減法(性能命中)
  2. 因為您沒有使用原始列值,所以您無法在時間列上使用索引(如果存在)
  3. 目前尚不清楚

嘗試這個:

unix_time > unix_timestamp(subdate(now(), interval '1' day))

這里每個查詢計算一次閾值日期時間,因此上述所有問題都已得到解決。

請參閱SQLFiddle演示

您可以將您unix_time使用from_unixtime功能

select r.*
  from reset_password_emails r
 where now() <= from_unixtime(r.unix_time) - interval '1' day

只需添加您想要的額外過濾器。

請在此處查看: http//sqlfiddle.com/#!9/4a7a9/3

它評估為無行,因為unix_time字段的給定數據全部來自2011

使用顯示轉換的sqlfiddle編輯:

http://sqlfiddle.com/#!9/4a7a9/4

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM