2017-05-08 145 views
0

我正在研究vBulletin論壇。這個想法是創建一個網頁,管理員可以查詢所有最新帖子並「讀取」它們,以便將它們標記爲「已檢查」。Mysql計算結果在where子句中?

該網頁的工作原理非常好,但是,查詢速度有點慢,因爲我們每天都會收到新帖子的貼子,現在它正在拉取過去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 isread

,然後AND isread > 0。這返回的錯誤

未知列「isread」

我最有可能試圖做一些事情非常愚蠢的或根本不明白這是如何entiry查詢工作,但我出來關於如何解決我的問題的想法。所以現在我問你們:)

+1

一些示例數據會很好。我無法遵循你的問題。 –

+1

@TimBiegeleisen這是小提琴:http://sqlfiddle.com/#!9/7dd95 – icecub

回答

0

如果你打算使用表別名,那麼縮短名稱,以便查詢更容易編寫和閱讀。然後,您需要修復JOIN s。 WHERE子句將一些外部連接轉換爲內部連接。然後,將條件移至適當的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可能是該表的主鍵,所以該表中的其他列很好。但是,如果有其他表的連接產生重複,該怎麼辦?

+0

什麼是匿名downvote的原因? –

+0

這不是我。我仍然在小提琴上工作 – icecub

+0

我很確定你的問題是'WHERE'條件將外連接變成內連接,這就是爲什麼我建議把條件放在'ON'子句中。 –