2

好吧,我的问题比标题所说的要难一些...

我有一个带有消息的表,我使用 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"

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

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");

那应该行得通。请注意,这可能会降低效率,具体取决于您的数据模型和您正在使用的数据量。

编辑

这将为您提供 OVERALL 最近的 10 个。如果您需要每个最近的 10 个thread_id,请查看 RolandoMySQLDBA 的答案。

干杯

于 2012-05-10T22:48:41.357 回答
0

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

于 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 回答
0

以相反的方式订购日期?

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

于 2012-05-10T22:51:35.533 回答