抱歉,我无法很好地解释这一点。我正在尝试编写一个 MyBB 插件,在几天后锁定一个线程。 threads
表中的重要列是tid、fid、lastpost、lastpostuserid、closed、sticky
。 posts
表有 pid、tid、fid、dateline
。
我有一个它需要运行的论坛列表 (fid
)。它需要更新那些在特定天数内没有响应的论坛中的所有线程,忽略来自机器人发布的特定用户 ID 的帖子。它需要更新 lock
、sticky
、fid
(用于移动线程),或发布回复。
插件是用 PHP 编写的,所以如果我需要处理任何结果,我可以在那里完成。
我的问题是我不太熟悉基本的 SELECT 或 UPDATE 命令之后的 SQL 查询,我不确定需要将其分解成哪些查询。
更新: 好的,这篇文章不是很清楚。
我有的表:
threads
:tid, fid, subject, prefix, icon, poll, uid, username, dateline, firstpost, lastpost, lastposter, lastposteruid, views, replies, closed, sticky, numratings , totalratings, notes, visible, unapprovedposts, attachmentcount, 删除时间
posts
:pid, tid, replyto, fid, subject, icon, uid, username, dateline, message, ipaddress, longipaddress, includesig, smilieoff, edituid, edittime, visible, posthash
我需要什么:
我需要锁定(将锁定字段更新为 1)、粘性(将粘性字段更新为 1)或移动(将 fid 更改为指定值),或回复(创建具有适当 tid 的新帖子以及那个)具有指定 fid(论坛 ID)的线程。
我遇到的麻烦是我不知道如何分解它。我知道 SQL 可以执行非常复杂的查询,这可以避免我执行多个查询和解析结果。
伪代码:
查找所有具有
fid
$fid 且lastpost
少于 $days 天前且lastposterid
不是 $userid (机器人发帖的用户)对于
fid
中具有lastposterid
作为 $userid 的线程,获取tid
。查找posts
中具有该tid
的所有帖子,uid
不是 $userid,并且最高的dateline
之前$天前。存储tid
。同时获取具有那些
<tid
的线程 - 现在我们拥有所有线程的最后一个响应不是 $days 前来自机器人的。更新这些线程的 lock、sticky 或 fid 字段(如果已指定)。
如果设置了回复,则创建一个新帖子以响应该话题。
这样有道理吗?我知道我不擅长解释这个。
最佳答案
我过去用 mysql 完成过类似的任务,方法是使用 mysql 的“事件”以特定的时间间隔自动执行任务 - 就像 SQL 的 cron。
查看:here's a tutorial , 和 here's MySQL's documentation .
更新:
我仍然不确定我是否完全理解你的问题,因为措辞有点困惑(你描述了一个名为线程的表,但随后提到“对于 fid 中的线程”),但我认为你在尝试什么可以通过(有点复杂的)更新来完成。
这个问题可能应该移至 dba.stackexchange.com...但是您要求的似乎是子查询的更新。标记为移动到 dba。
关于php - 复杂 MySQL 查询的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14163838/