我正在开发一个PHP脚本,我有一个管理控制面板来添加用户,我需要添加一些选项,如用户每月帖子 - 用户每日帖子 - 用户每小时帖子,让我们说我设置用户每月发布到30,用户每日发布为10,用户每小时发布为5,即:
用户每月只能发布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,
我需要知道:
任何人都可以帮我看看我能做到这一点,谢谢你的朋友们
答案 0 :(得分:0)
在插入帖子之前,您可以运行类似此查询的查询来查找每小时,每日和每月的帖子,并在代码中检查并决定允许/不允许用户添加帖子。 在不了解您的架构的情况下,我刚为您的帖子表中的列创建了一些可能的名称当然,您的用户ID(1)应该替换为您试图阻止添加帖子的用户的用户ID。
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
答案 1 :(得分:0)
在“用户帖子”表格中添加“发布日期时间”列。对于这个例子,我们将调用新列`created_dt`(使用DATETIME的dataype。我们还假设表的名称是`user_post`。
插入行时,使用当前日期和时间填充新列。
当用户尝试发布另一行时,您可以检查是否已超出任何限制。
select s1.empid, s1.qtr, s1.salary
from s1 right other join
((select distinct empid from s1) s3 cross join s2) t
on s1.empid = t.empid and s1.qtr = t.qtr
然后,您可以将返回的值与用户的限制进行比较,以查看是否已超出任何限制,或者如果添加了其他帖子则会超出限制。
为了获得此查询的最佳性能,您需要一个索引
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)
使用这种方法,您不需要一堆不必要的DML来增加计数器和重置计数器。您对用户限制所做的任何更改都可能立即生效。
您可以使用值“0”来指定“无限制”。您进行比较的逻辑需要考虑到这一点。
我就是这样做的。
我还可以将计数与查询本身的限制进行比较,返回“剩余的帖子数”,直到超出限制。
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
需要制定“禁令”(不允许发布职位)和“无限制”(职位无限制)的机制。例如,使用0表示禁止,使用NULL表示“无限制”。
有了这个,我们就知道当查询返回一个值小于或等于零的列时,就意味着超出了一个限制(或者将被另一个帖子超过。)所有其他值(NULL列中的正整数)表示允许“下一篇文章”。
答案 2 :(得分:0)
我已更新Tin 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