1

申し訳ありませんが、これをうまく説明できません。数日後にスレッドをロックする MyBB プラグインをコーディングしようとしています。表の重要な列は次のthreadsとおりですtid, fid, lastpost, lastpostuserid, closed, stickypostsテーブルにはpid, tid, fid, dateline.

fid実行する必要があるフォーラム ( ) のリストがあります。ボットが投稿する特定のユーザー ID からの投稿を無視して、一定の日数内に応答がないフォーラムのすべてのスレッドを更新する必要があります。locksticky、 (スレッドを移動するため)を更新する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, deletetime

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 は非常に複雑なクエリを実行できるため、複数のクエリを実行して結果を解析する必要がなくなります。

擬似コード:

  1. fid$fid でlastpost$days 日以内のすべてのスレッドを検索し、lastposterid$userid (ボットが投稿したユーザー) ではありません

  2. $useridfidを持つスレッドについては、 . $userid ではなく、$days 前の最高の投稿をすべて検索します。を保管してください。lastposteridtidpoststiduiddatelinetid

  3. それらtidのスレッドも取得します。これで、$days 以上前にボットからのものではない最後の応答を持つすべてのスレッドが得られました。

  4. 指定されている場合は、それらのスレッドの lock、sticky、または fid フィールドを更新します。

  5. 返信が設定されている場合、そのスレッドへの返信として新しい投稿を作成します。

そういう意味ですか?私はこれを説明するのが苦手であることを理解しています。

4

1 に答える 1

0

過去に、mysql の「イベント」を使用して、SQL の cron のように、特定の間隔でタスクを自動的に実行することにより、mysql で同様のタスクを達成しました。

確認してください:ここにチュートリアルがあり、ここに MySQL のドキュメントがあります。

アップデート:

言葉遣いが少し混乱しているため、質問を完全に理解しているかどうかはまだわかりません(スレッドという名前のテーブルを説明していますが、「fidのスレッドについて」と述べています)が、達成しようとしていることができると思います(やや複雑な)UPDATEで行われます。

この質問はおそらく dba.stackexchange.com に移動する必要があります...しかし、あなたが求めているのはサブクエリの更新のようです。dba への移動のフラグが立てられました。

于 2013-01-04T20:36:13.267 に答える