我有一个包含消息的表,我使用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"
有没有办法做这样的事情......?
答案 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
我想。