2016-04-15 24 views
-2

我正在開發一個php腳本,我有一個管理控制面板來添加用戶,而且我需要添加一些選項,如用戶月刊 - 用戶每日帖子 - 用戶每小時的帖子,比方說,我設置用戶每月發佈到30和用戶每日帖子是10,用戶每小時發帖是5,這將是:PHP/MysQl在月 - 日 - 小時限制用戶帖子

用戶只能發佈5個職位每小時和10個職位每天從每月30個帖子限制,如果使用用戶月刊,他不能在本月添加帖子,下個月我想自動添加另外30個帖子!

我的用戶表名(用戶):

`id` int(11) NOT NULL AUTO_INCREMENT, 
`username` varchar(255) DEFAULT NULL, 
`password` varchar(255) DEFAULT NULL, 
`monthly` int(2) unsigned NOT NULL, 
`daily` int(10) unsigned NOT NULL, 
`hourly` int(10) unsigned NOT NULL, 

而且我的職位表名是user_post

`id` int(11) NOT NULL AUTO_INCREMENT, 
    `title` varchar(255) NOT NULL, 
    `created_dt` datetime NOT NULL, 
    `user` int(10) unsigned NOT NULL, 

我需要知道:

  1. 如何使每月用戶專欄每月更新爲30,如果我向用戶註冊30個月的帖子限制。
  2. 當用戶登錄,他想發佈,如何檢查他是否有更多的每月,每日,每小時的帖子剩餘!

誰能幫我看看我怎麼能做到這一點,謝謝我的朋友們

+1

我猜你必須做的職位,你的月經的計數()查詢,並防止用戶添加一個職位。 –

+0

@TinTran感謝您的快速響應,但我每月每小時有3個限制,我必須在這些限制之間建立關係! –

+1

在不知道表格模式的情況下很難嘗試提供幫助...爲什麼不平衡一些測試數據? –

回答

0

將「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或正整數)意味着將允許「下一篇文章」。

+0

感謝你的興趣我的朋友,我不明白這是如何工作的,我在主要問題中添加了我的表格信息,你能幫我解決嗎? –

+0

我如何獲取此結果? –

+0

如果您的期間需要更具體的「邊界」,則可以使用表達式來導出期間開始的日期時間。這裏的示例中使用的表達式僅僅是由當前日期和時間定義的時間段返回一定的時間。例如,要獲得「自本月初以來」,可以使用**'DATE_FORMAT(NOW(),'%​​Y-%m-01')+ INTERVAL 0 DAY **等表達式。模式是一樣的,只是改變表達式。 – spencer7593

0

前插入一個帖子,你可以運行這樣的查詢類似的查詢,找出自己的帖子爲每小時,每天,和每月檢查並在代碼中確定允許/不允許用戶添加帖子。 不知道你的模式,我只是爲你的發佈表中的列創建了一些可能的名稱。當然你的userid(1)應該替換爲你試圖阻止添加帖子的用戶的用戶名。

SELECT SUM(CASE WHEN created_at > CURRENT_TIMESTAMP() - INTERVAL 1 HOUR THEN 1 
      ELSE 0 
      END) AS hourly_posts, 
     SUM(CASE WHEN created_at > CURRENT_TIMESTAMP() - INTERVAL 1 DAY THEN 1 
      ELSE 0 
      END) AS daily_posts, 
     SUM(CASE WHEN created_at > CURRENT_TIMESTAMP() - INTERVAL 1 MONTH THEN 1 
      ELSE 0 
      END) AS monthly_posts 
FROM posts 
WHERE userid = 1 
+0

它將返回第1,第1小時,第1天和第1個月,但不是第二小時/日/月,你需要添加條件爲當前小時/飛蛾/天也。 –

+0

是什麼?我只是在最後一小時/一天/一月內做了一些帖子...... –

+0

我沒有返回真或假..我將返回計數 –

0

我已經更新田Tran的代碼:

SELECT SUM(CASE WHEN (created_at > CURRENT_TIMESTAMP() - INTERVAL 1 HOUR) and date_format(CURRENT_TIMESTAMP(),'%H') = date_format(created_at,'%H')) THEN 1 
      ELSE 0 
      END) AS hourly_posts, 
     SUM(CASE WHEN (created_at > CURRENT_TIMESTAMP() - INTERVAL 1 DAY and date_format(CURRENT_TIMESTAMP(),'%D') = date_format(created_at,'%D')) THEN 1 
      ELSE 0 
      END) AS daily_posts, 
     SUM(CASE WHEN (created_at > CURRENT_TIMESTAMP() - INTERVAL 1 MONTH and date_format(CURRENT_TIMESTAMP(),'%m') = date_format(created_at,'%m')) THEN 1 
     ELSE 0 
     END) AS monthly_posts 
FROM posts 
WHERE userid = 1 
+0

感謝你的回答我的朋友,我已經更新了我的答案,並且我已經添加了我的表格架構,你能教我如何讓我需要發生的事情嗎? –

+0

我的查詢不符合您的要求? –

+0

我無法知道我將如何使用它,因爲我不知道我的表是否適合執行此查詢 –