Php 如何使用MySQL Join按论坛线程的最后回复对其进行排序?
我在为此编写查询时遇到了一些麻烦。我想我已经掌握了基本的逻辑,尽管我可能没有。我想做的是根据用户正在查看的线路板获取所有线程,然后根据最后一次回复的时间对这些线程进行排序。查询不会返回任何错误,它只获取最近更新的线程 我的问题是: $query = " SELECT t.child_id, t.thread_id, m.thread_id, m.message_id, m.date_posted FROM forum_threads AS t LEFT JOIN forum_messages AS m ON t.thread_id = m.thread_id WHERE t.child_id = ".$board_id." ORDER BY m.date_posted DESC LIMIT ".$starting.", ".$this->user['results_per_page']; 这是正在返回的查询: SELECT t.child_id, t.thread_id, m.thread_id, m.message_id, m.date_posted FROM forum_threads AS t LEFT JOIN forum_messages AS m ON t.thread_id = m.thread_id WHERE t.child_id = 2 ORDER BY m.date_posted DESC LIMIT 0, 15 使现代化 我已经尝试去接受ethrbunny建议的想法,尽管我完全不知道是什么导致它返回错误 $query = " SELECT t.board_id, t.thread_id FROM forum_threads AS t LEFT JOIN ( SELECT m.thread_id, m.message_id FROM forum_messages AS m WHERE m.thread_id = t.thread_id ORDER BY m.message_id DESC LIMIT 1 ) AS q WHERE t.board_id = ".$board_id." ORDER BY q.date_posted DESC LIMIT ".$starting.", ".$this->user['results_per_page']; 但为什么date_发布了一条短信?它不应该是一个日期时间,或者如果是一个时间戳,可能是一个整数吗 因为永远无法在文本列上优化运行MAX,所以建议使用Php 如何使用MySQL Join按论坛线程的最后回复对其进行排序?,php,mysql,join,Php,Mysql,Join,我在为此编写查询时遇到了一些麻烦。我想我已经掌握了基本的逻辑,尽管我可能没有。我想做的是根据用户正在查看的线路板获取所有线程,然后根据最后一次回复的时间对这些线程进行排序。查询不会返回任何错误,它只获取最近更新的线程 我的问题是: $query = " SELECT t.child_id, t.thread_id, m.thread_id, m.message_id, m.date_posted FR
MAX(m.message_id) AS latest_reply
相反,作为可能按日期顺序插入的消息,应该是等效的
编辑以添加:
查询已全部写出
$query = "
SELECT t.thread_id, title,
MAX(m.message_id) AS latest_reply
FROM forum_threads AS t
LEFT JOIN forum_messages AS m ON t.thread_id = m.thread_id
WHERE t.child_id = ".$board_id."
GROUP BY t.thread_id
ORDER BY latest_reply DESC
LIMIT ".$starting.", ".$this->user['results_per_page'];
我认为您的查询是正确的,请回显您的查询并检查限制值。SqlFIDLE今天早上与我发生冲突-因此这主要是一个猜测
select <columns> from forum_threads t0
left join
( select <columns> from forum_messages m0 where m0.thread_id = t0.thread_id
order by m0.date_posted desc limit 1) as q0
order by q0.date_posted desc;
我很好奇为什么日期字段是文本。这将使排序变得困难。Yo可以在orderby中使用SELECT语句来选择线程回复的最新日期。可以在此处找到一个示例: 对于您的桌子,应该是这样的:
SELECT * FROM forum_threads ft ORDER BY (SELECT date_posted FROM forum_messages fm WHERE fm.thread_id = ft.thread_id ORDER BY date DESC LIMIT 1) DESC;
但请看提供的示例。第一个按线程日期查询订单,第二个按最新回复日期查询订单。尝试以下查询
SELECT
t.child_id, t.thread_id,
m.thread_id, m.message_id, m.date_posted
FROM
forum_threads AS t
LEFT JOIN forum_messages AS m ON t.thread_id = m.thread_id
LEFT JOIN forum_messages AS m1 ON m.thread_id = m1.thread_id AND m.date_posted < m1.date_posted
WHERE
t.child_id = ".$board_id." AND m1.date_posted is null
ORDER BY m.date_posted DESC
LIMIT ".$starting.", ".$this->user['results_per_page'];
执行子选择以获取按线程id分组的最新消息,然后根据主表加入该消息,非常简单:-
$query = "SELECT t.board_id, t.thread_id, MaxMessageId
FROM forum_threads AS t
LEFT JOIN (SELECT thread_id, MAX(message_id) AS MaxMessageId FROM forum_messages GROUP BY m.thread_id ) AS q
ON q.thread_id = t.thread_id
WHERE t.board_id = ".$board_id."
ORDER BY MaxMessageId DESC
LIMIT ".$starting.", ".$this->user['results_per_page'];
我已更新我的问题,以包含查询字符串。似乎返回的限制值是正确的。我尝试了你关于MAXm.date_的建议,但也没有成功。同样的事情。啊,你错过了小组,原来没有注意到。将它添加到我的查询中。你只是希望每个线程都有一条消息,然后用最近的消息/线程对整个列表进行排序?如果你还在挣扎,考虑提供一个SqLFIDLE。EthBunNy或KKESTART应该得到赏金,这些概念是正确的解决方案。不过,您在更新中发布的信息还不足以解决问题。如果在运行查询之前回显$query,您将看到正在调试的确切语句,而不是微不足道的mysql语法错误。也许在t.thread\u id=q.thread\u id'上的'as q'之后添加您想要论坛\u消息表中的任何详细信息,例如消息\u id吗?如果不是,那么巴里亨特的解决方案是好的,但是如果你这样做了,它就不会给出正确的结果。
SELECT
t.child_id, t.thread_id,
m.thread_id, m.message_id, m.date_posted
FROM
forum_threads AS t
LEFT JOIN forum_messages AS m ON t.thread_id = m.thread_id
LEFT JOIN forum_messages AS m1 ON m.thread_id = m1.thread_id AND m.date_posted < m1.date_posted
WHERE
t.child_id = ".$board_id." AND m1.date_posted is null
ORDER BY m.date_posted DESC
LIMIT ".$starting.", ".$this->user['results_per_page'];
$query = "SELECT t.board_id, t.thread_id, MaxMessageId
FROM forum_threads AS t
LEFT JOIN (SELECT thread_id, MAX(message_id) AS MaxMessageId FROM forum_messages GROUP BY m.thread_id ) AS q
ON q.thread_id = t.thread_id
WHERE t.board_id = ".$board_id."
ORDER BY MaxMessageId DESC
LIMIT ".$starting.", ".$this->user['results_per_page'];
select UDID,CID,CType
from uploaded_design ud
left join
(select CID,CDesign,CType
from design_comment
order by CID desc) dc
on
ud.UDID = dc.CDesign
group by dc.CDesign
order by dc.CID