5

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

这是我的查询:

$查询 = "
            选择
            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."
            按 m.date_posted DESC 排序
            限制 ".$starting.", ".$this->user['results_per_page'];

这是正在返回的查询:

            选择 t.child_id、t.thread_id、m.thread_id、m.message_id、m.date_posted   
            FROM forum_threads AS t   
            左加入 forum_messages AS m   
            ON t.thread_id = m.thread_id   
            哪里 t.child_id = 2   
            ORDER BY m.date_posted DESC LIMIT 0, 15

在此处输入图像描述

在此处输入图像描述

更新

我试图采用 ethrbunny 提出的想法,尽管我完全不知道导致它返回错误的原因。

$查询 = "
            选择
            t.board_id, t.thread_id
            FROM forum_threads AS t
            左连接(
            选择 m.thread_id,m.message_id
            FROM forum_messages AS m
            哪里 m.thread_id = t.thread_id
            按 m.message_id DESC 排序
            限制 1
            ) 作为 q
            WHERE t.board_id = ".$board_id."
            ORDER BY q.date_posted DESC
            限制 ".$starting.", ".$this->user['results_per_page'];
您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以在第 11 行的“WHERE t.board_id = 4 ORDER BY q.date_posted DESC LIMIT”附近使用正确的语法
4

7 回答 7

7
SELECT ... , MAX(m.date_posted) AS latest_reply ...

GROUP BY t.thread_id
ORDER BY latest_reply DESC ...

但是为什么 date_posted 是一个 TEXT?它不应该是日期时间,或者可能是 int(如果是时间戳)

因为永远无法优化在文本列上运行 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'];
于 2013-06-19T14:21:39.537 回答
2

(SQLFiddle 今天早上和我打架 - 所以这主要是猜测)

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;

我很好奇为什么你的日期字段是text. 这将使排序变得困难。

于 2013-06-19T15:29:32.657 回答
2

你可以在 ORDER BY 中使用 SELECT 语句来选择线程回复的最新日期。可以在这里找到一个例子:

SQL 小提琴

使用您的表,将是这样的:

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;

但请查看提供的示例。第一个按线程日期查询订单,第二个按最新回复日期查询。

于 2013-06-24T09:24:41.290 回答
1

我认为您的查询是正确的,请回显您的查询并检查 LIMIT 的值。

于 2013-06-19T14:22:22.107 回答
1

简单地进行子选择以获取按线程 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'];
于 2013-06-26T16:04:59.110 回答
1
选择 UDID、CID、CType
来自uploaded_design ud
左连接
(选择 CID、CDesign、CType
 来自设计评论
 按 CID desc 订购)dc
上
ud.UDID = dc.CDesign
由 dc.CDesign 分组
按 dc.CID 订购
于 2016-02-02T12:43:32.280 回答
-1

尝试以下查询

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'];
于 2013-06-26T14:29:42.197 回答