2

さて、私の問題はタイトルが言うよりも少し難しいです...

メッセージを含むテーブルがあります。whileループを使用して、これらすべてのメッセージをphpにロードします。

私のSQLクエリは現時点では次のようになっています。

"SELECT * 
 FROM messages 
 WHERE thread_id = '" . $thread_id . "'
 ORDER BY date_sent"

正常に動作し、すべてのメッセージを次々に返すので、下部に最新のメッセージが表示されます(これは、メッセージングモジュールがFacebookのように機能し、下部に小さな返信フィールドがあり、ユーザーが直接チャットできるようにするために重要です)

さて、私が欲しいのは、1回のクエリで最新の10件の結果のみを取得するクエリです。

私はすでに必要な結果の数を持っています($ number_of_results = 10;)

最初に結果の行を数える必要がなく、単一のクエリで結果を要求する場合は、本当にすばらしいでしょう。

何かのようなもの:

"SELECT * 
 FROM messages 
 WHERE thread_id = '" . $thread_id . "'
 ORDER BY date_sent 
 LIMIT TOTAL_NUMBER_OF_ROWS_WHERE_THREAD_ID_IS_MY_THREAD_ID-$number_of_results, $number_of_results"

このようなことをする方法はありますか...?

4

6 に答える 6

6
"SELECT * 
 FROM messages 
 WHERE thread_id = '" . $thread_id . "' 
 ORDER BY date_sent DESC 
 LIMIT 10";

このインデックスがあることを確認してください

ALTER TABLE messages 
ADD INDEX threadid_datesent_ndx( thread_id, date_sent );

10を再び逆にしたい場合は、次のようにします。

"SELECT * 
 FROM
 (
     SELECT * 
     FROM messages 
     WHERE thread_id = '" . $thread_id . "' 
     ORDER BY date_sent DESC LIMIT 10
 ) A
 ORDER BY date_sent";
于 2012-05-10T22:47:59.280 に答える
5

LIMITは結果セットを制限し、SQL_CALC_FOUND_ROWSは、LIMITなしで返される行の数をカウントします。

SELECT SQL_CALC_FOUND_ROWS *
FROM messages
WHERE thread_id = :thread_id
ORDER BY date_sent DESC
LIMIT 10

次に、を使用mysql_num_row()してカウントを取得します。

于 2012-05-10T22:53:50.813 に答える
0

ループを完全に避けましょう:

$threadIds = array(100,101,102); // etc

$result = mysql_query("SELECT * FROM messages WHERE thread_id IN (".implode(',', $threadIds).") ORDER BY date_sent DESC LIMIT 10");

それはうまくいくはずです。データモデルと使用しているデータの量によっては、これは効率が低下する可能性があることに注意してください。

編集

これにより、全体的に最新の10が得られます。それぞれに最新の10が必要な場合は、thread_idRolandoMySQLDBAの回答を確認してください。

乾杯

于 2012-05-10T22:48:41.357 に答える
0

逆に日付を注文しますか?

"SELECT*FROMメッセージWHEREthread_id='"。$thread_id。"'ORDERBY date_sentDESCLIMIT"。$number_of_results

于 2012-05-10T22:51:35.533 に答える
0

Rolandoは正しいです。レコードを逆方向に並べ替える必要があり、この制限の結果の後になります。

于 2012-05-10T22:54:46.110 に答える
0

何かのようなもの

Select * From 
  (Select top(10) * From Messages Where threadid = ? order by date_sent desc) dummyName
Order By date_sent asc

おもう。

于 2012-05-10T22:57:19.520 に答える