1
//get the messages from the database
$messagesID_query = mysql_query("SELECT
                                   messageID,
                                   posterID,
                                   messageTime,
                                   message
                                 FROM
                                   chat_messages
                                 ORDER BY
                                   messageTime DESC
                                 LIMIT
                                   20");

上記のmysql_queryは、テーブルから最新の20エントリを返します。ただし、理想的には、行をフェッチする前にリソースを逆にする必要があります。

現時点では、2つのループを実行しています。1つはすべての結果をphp配列にフェッチするためのもので、もう1つは配列を処理して逆にした場合に出力するためのものです。

これが機能する方法を最適化しようとしています...行のフェッチを開始する前にmysqlリソースを逆にすることは可能ですか?そのため、phpで配列を逆にする必要はありませんか?

または、クエリを書き直して、上記の行を逆の順序で返す方法を検討しましたが、上記のように最新の20件の結果を取得する方法はありますか?

4

1 に答える 1

4

これはクエリで行うのが最適です。全体をサブクエリでラップし、それを昇順に並べ替えmessageTimeます。mysql_data_seek()これにより、20 よりも大きな行セットで行を逆方向にフェッチするための一連の呼び出しをループするよりも、データベース サーバーの CPU リソースを大幅に節約できます。

SELECT * FROM 
(
  SELECT
    messageID,
    posterID,
    messageTime,
    message
  FROM
  chat_messages
  /* Subquery is used to get the most recent 20 by messageTime */
  ORDER BY messageTime DESC
  LIMIT 20
) subq
/* Reorder the result of the subquery to put them back into ascending order */
ORDER BY messageTime ASC
于 2012-04-17T16:14:23.960 に答える