將「datetime posted」列添加到您的「user posts」表中。對於這個例子,我們將調用新列`created_dt`(使用DATETIME數據包,我們還假定表的名稱是`user_post`。
當插入一行時,填充新的當前日期和時間列。
當用戶嘗試張貼另一行,你可以執行檢查任何限制是否已經被超過。
SELECT SUM(1) AS cnt_past_month
, SUM(p.created_dt >= NOW() + INTERVAL -7 DAY) AS cnt_past_week
, SUM(p.created_dt >= NOW() + INTERVAL -1 HOUR) AS cnt_past_hour
FROM user_post p
WHERE p.user_id = ?
AND p.created_dt >= NOW() - INTERVAL 1 MONTH
然後,您可以比較值返回到極限對於用戶來說,查看是否超出了任何限制,或者如果添加了另一個帖子,將會被超過。
對於此查詢的最佳性能,你會希望有一個指標
ON user_post(userid, created_dt)
你可以得到查詢本身內的用戶的限制...
SELECT q.count_past_month
, m.limit_past_month
, q.count_past_week
, m.limit_past_week
, q.count_past_hour
, m.limit_past_hour
FROM (SELECT p.userid
, SUM(1) AS cnt_past_month
, SUM(p.created_dt >= NOW() - INTERVAL 7 DAY) AS cnt_past_week
, SUM(p.created_dt >= NOW() - INTERVAL 1 HOUR) AS cnt_past_hour
FROM user_post p
WHERE p.user_id = ?
AND p.created_dt >= NOW() - INTERVAL 1 MONTH
) q
CROSS
JOIN (SELECT MIN(l.limit_per_month)
, MIN(l.limit_per_week)
, MIN(l.limit_per_hour)
FROM user_limit l
WHERE l.user_id = ?
) m
用這種方法,您不需要一堆不必要的DML來增加計數器,並重置計數器。您對用戶的限制所做的任何更改都可能立即生效。
而且您可以使用值「0」來指定「無限制」。您的比較邏輯需要考慮到這一點。
這就是我會這樣做的。
我也可以將查詢本身的計數與限制進行比較,返回「剩餘帖子數」,直到超出限制。
SELECT m.limit_past_month-IFNULL(q.count_past_month,0) AS remaining_past_month
, m.limit_past_week -IFNULL(q.count_past_week ,0) AS remaining_past_week
, m.limit_past_hour -IFNULL(q.count_past_hour ,0) AS remaining_past_hour
FROM (
需要制定「禁止」(不允許發佈帖子)和「無限制」(不限制帖子)的機制。例如,使用0代表禁止,用NULL代表「無限制」。因此,我們知道當查詢返回值小於或等於零的列時,這意味着超過了限制(或將被另一個帖子超過)。所有其他值(該列中的NULL或正整數)意味着將允許「下一篇文章」。
我猜你必須做的職位,你的月經的計數()查詢,並防止用戶添加一個職位。 –
@TinTran感謝您的快速響應,但我每月每小時有3個限制,我必須在這些限制之間建立關係! –
在不知道表格模式的情況下很難嘗試提供幫助...爲什麼不平衡一些測試數據? –