Php 如何使用MySQL Join按论坛线程的最后回复对其进行排序?

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

我在为此编写查询时遇到了一些麻烦。我想我已经掌握了基本的逻辑,尽管我可能没有。我想做的是根据用户正在查看的线路板获取所有线程,然后根据最后一次回复的时间对这些线程进行排序。查询不会返回任何错误,它只获取最近更新的线程

我的问题是:

$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,所以建议使用

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