2

わかりやすくするために、前の質問を削除します。私はこのデータベーススキーマを使用してフォーラムを開発しています。

ID:INT->PRIMARY-KEY->AUTO_INCREMENT
IDTOPIC:INT (0 if it is the "father" topic OR father's ID if it's a reply)
IDUSER:INT (ID of user who posted)
CONTENT:MEDIUMTEXT
DATE:TIMESTAMP

日付順にクエリを作成する必要があります。最後のスレッドの返信のみを取得する場所(「私が最後に返信したユーザーである場合」、IDUSER <> $ useridではない)、または返信がない場合は親スレッドのトピックを取得します。トピックや返信の結果でも、最初のスレッドIDTOPIC/IDUSERを印刷する必要があります

私の理想的な結果は次のようになります。

ID:IDTOPIC:IDUSER:CONTENT:DATE:IDLASTREPLY:IDLASTUSERREPLY:LASTCONTENTREPLY:LASTDATEREPLY

最後の4つのフィールドがNULLの場合は問題ありません。可能な限り最速のクエリが必要です。私を助けてください!

4

2 に答える 2

1
SELECT fa.ID, fa.IDTOPIC, fa.IDUSER, fa.CONTENT, fa.DATE,
  re.ID as IDLASTREPLY,
  re.IDUSER as IDLASTUSERREPLY,
  re.CONTENT as LASTCONTENTREPLY,
  re.DATE as LASTDATEREPLY,
  CASE WHEN (re.DATE is NULL) THEN fa.DATE ELSE re.DATE END as LASTUPDATE
FROM post fa
  LEFT JOIN post re ON re.ID =
    (SELECT ID FROM post WHERE IDTOPIC = fa.ID ORDER BY DATE DESC LIMIT 1)
WHERE fa.IDTOPIC = 0
ORDER BY LASTUPDATE DESC

好きなように注文してください。
しかし、それはあまり良いパフォーマンスではありません。テーブル構造を改善できると思います。

編集: ORDER に LASTUPDATE を追加

于 2012-04-25T17:57:49.513 に答える
0

残念ながら、いくつかの投稿の後、この選択はあまり良くありません...今日、テーブルに合計約 900 のレコードがあり、ユーザー ID (45 の個別のスレッドのみ!) でスレッドをフィルタリングすると、MySQL は 0.30 秒を必要とします (最初は、0.04/0.05 秒しか必要ありませんでした...劣化は、サブスクライブしたスレッドの数に比例すると思います) これは、300 の個別のスレッドをサブスクライブする場合、このクエリを約 2 秒待つ必要があることを意味します。 ..それは多すぎます。奇妙なことに、このクエリを「0,10 に制限」するか、完全なクエリを取得しても、実行速度は変わりません。これが良くないと思う理由です...制限してもデータ全体を選択する必要があると思うからです。解決する方法はありません。これがクエリのセットアップ方法です。新しい通知テーブルがあり、

通知テーブル フィールド: id、idcontent、userid

SELECT 
    CASE WHEN (re.id is NULL) THEN fa.id ELSE re.id END AS id, 
    fa.id as idtopic, 
    CASE WHEN (re.userid is NULL) THEN fa.userid ELSE re.userid END AS userid, 
    CASE WHEN (re.content is NULL) THEN fa.content ELSE re.content END AS content, 
    n.notify, 
    u.id as reuserid, u.name, u.surname, u.photo, 
    CASE WHEN (re.date is NULL) THEN unix_timestamp(fa.date) ELSE unix_timestamp(re.date) END AS LASTUPDATE 
FROM notifications AS n 
LEFT JOIN post AS fa 
    ON fa.id = n.idcontent 
LEFT JOIN post AS re 
    ON re.id=(SELECT ID FROM post WHERE IDTOPIC = fa.ID AND userid <> $USERID ORDER BY DATE DESC LIMIT 1) 
LEFT JOIN users AS u 
    ON u.id = ( CASE WHEN (re.userid is NULL) THEN fa.userid ELSE re.userid END ) 
WHERE 
    n.userid = $USERID 
    AND NOT (fa.userid = $USERID AND re.userid = $USERID)
于 2012-05-09T23:15:55.137 に答える