2017-05-08 6 views
0

私はvBulletinフォーラムに取り組んでいます。アイデアは、管理者が最新の投稿をすべて照会して「読んだ」ので、「チェック済み」とマークされるウェブページを作成することです。where節のMySQLの計算結果?

ウェブページは完璧に機能しますが、毎日新しい投稿が数千件あり、過去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 

のみに未チェックの記事を取得し、私は私の最初のソリューションだけで

AND thread.lastpost-threadread.readtime > 0を追加しました

thread.lastpost-threadread.readtime > 0

を計算する必要がありますwhere句に渡します。しかし、これはthreadread.userid = 90122なくthreadread.threadid = thread.threadid

だから私の考えは

SELECT ... thread.lastpost-threadread.readtime AS isread

、その後AND isread > 0を行うことでしたを選択するだけに

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

を引き起こしました。これは、エラーが返さ

不明な列「isread」

私が最も可能性の高い非常に愚かな何かをしようとしているか、またはこのentiryクエリが動作しているか、単に理解していないが、私はアウトです私の問題を解決する方法に関するアイデアだから私は皆さんにお尋ねします:)

+1

いくつかのサンプルデータは素晴らしいでしょう。私はあなたの質問に従うことができませんでした。 –

+1

@TimBiegeleisenここにフィドルがあります:http://sqlfiddle.com/#!9/7dd95 – icecub

答えて

0

テーブルエイリアスを使用する場合は、名前を短くして、クエリの書き込みと読み込みが容易になるようにします。

次に、JOINを修正する必要があります。 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'節に条件を入れることを示唆しているからです。 –