mysql在单个查询中查询最新的10个结果

时间:2012-05-10 22:45:31

标签: php mysql

好吧,我的问题比标题所说的要困难得多......

我有一个包含消息的表,我使用while循环在php中加载所有这些消息。

我的sql查询目前看起来像这样:

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

工作正常,并返回所有消息,以便我在底部有最新消息(这很重要,因为我的消息模块像facebook一样工作,底部有一个小的回复字段,让用户直接聊天)

现在,我想要的是一个查询,只能在一次查询中给我最新的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"

有没有办法做这样的事情......?

6 个答案:

答案 0 :(得分: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";

答案 1 :(得分: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()来计算。

答案 2 :(得分: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个。如果您需要每个thread_id最近10个,请查看RolandoMySQLDBA的答案。

干杯

答案 3 :(得分:0)

反过来订购日期?

“SELECT * FROM messages WHERE thread_id ='”。$ thread_id。“'ORDER BY date_sent DESC LIMIT”。$ number_of_results

答案 4 :(得分:0)

罗兰多是对的。您必须向后订购记录并在此限制结果之后。

答案 5 :(得分:0)

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

我想。