Mysql在where子句中计算结果?

标签 mysql

我正在 vBulletin 论坛工作。我们的想法是创建一个网页,管理员可以在其中查询所有最新帖子并“阅读”它们,以便将它们标记为“已检查”。

网页运行得很好,但是查询有点慢,因为我们每天都会收到数千个新帖子,而现在它正在提取过去 24 小时内的所有帖子。

为了解决这个问题,我希望它只提取尚未检查的帖子。

原始查询如下:

SELECT 
thread.forumid, thread.firstpostid, thread.lastpost, thread.lastposter, thread.lastpostid, thread.replycount, 
thread.threadid, thread.title, thread.open, thread.views, post.pagetext AS preview, post.userid AS lastpuserid, threadread.readtime AS readtime, threadread.userid AS userid
FROM thread AS thread
LEFT JOIN deletionlog AS deletionlog ON (thread.threadid = deletionlog.primaryid AND deletionlog.type = 'thread')
LEFT JOIN post AS post ON (post.postid = thread.lastpostid)
LEFT JOIN threadread AS threadread ON (threadread.threadid = thread.threadid AND threadread.userid = 90122)
WHERE open <> 10
AND thread.lastpost >=  1494100000
AND thread.forumid NOT IN(0013482730313233343537)
AND thread.visible = '1'
AND post.visible = 1
AND deletionlog.primaryid IS NULL

GROUP BY thread.threadid
ORDER BY thread.lastpost DESC

为了只获取未检查的帖子,我需要计算

thread.lastpost-threadread.readtime > 0

我的第一个解决方案是添加

AND thread.lastpost-threadread.readtime > 0 到 where 子句。然而,这导致了

LEFT JOIN threadread AS threadread ON (threadread.threadid = thread.threadid AND threadread.userid = 90122)

仅选择threadread.userid = 90122,而不选择threadread.threadid = thread.threadid

所以我的想法是这样做

SELECT ... thread.lastpost-threadread.readtime AS 已读取

然后AND isread > 0。这返回了错误

Unknown column 'isread'

我很可能试图做一些非常愚蠢的事情,或者根本不明白整个查询是如何工作的,但我不知道如何解决我的问题。所以现在我问你们:)

最佳答案

如果您要使用表别名,请缩短名称,以便查询更易于编写和阅读。

然后,您需要修复JOINWHERE 子句将一些外连接转变为内连接。然后,将条件移至适当的 ON 子句。

我想这就是你想要的:

SELECT t.forumid, t.firstpostid, t.lastpost, t.lastposter, t.lastpostid, t.replycount, 
       t.threadid, t.title, t.open, t.views, p.pagetext AS preview, p.userid AS lastpuserid, tr.readtime AS readtime, tr.userid AS userid
FROM thread t JOIN
     post p
     ON p.postid = t.lastpostid LEFT JOIN
     deletionlog dl
     ON t.threadid = dl.primaryid AND dl.type = 'thread' LEFT JOIN
     threadread tr
     ON tr.threadid = t.threadid AND tr.userid = 90122 AND
        t.lastpost > tr.readtime
WHERE open <> 10 AND
      t.lastpost >=  1494100000 AND
      t.forumid NOT IN (0013482730313233343537) AND
      t.visible = 1 AND
      p.visible = 1 AND
      dl.primaryid IS NULL
GROUP BY t.threadid
ORDER BY t.lastpost DESC;

我不确定 GROUP BY 应该做什么。在未聚合的列上使用没有聚合函数的 GROUP BY 通常是一个非常糟糕的主意。在本例中,t.threadid 可能是表的主键,因此该表中的其他列都没有问题。但是,如果与其他表的联接生成了重复项怎么办?

关于Mysql在where子句中计算结果?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43838369/

相关文章:

mysql - 迁移localhost MySQL到AWS Oracle好像要等四个小时

mysql - 从 WordPress 内部恢复 .sql 导出到 WordPress 数据库?

mysql - MySQL模糊搜索的Big-O

mysql - 需要帮助使用在两个单独表的列之间进行算术运算的函数将列添加到一个表

php - Openfire:存档消息 NULL 参与者

MySQL:显示总数

mysql - 如何向 bash 字符串添加括号和单引号

javascript - 如何通过 Rails 5 中的链接选择单选按钮?

php - 为什么检查重复用户名的代码无法正确执行?

mysql 双值检查问题