【问题标题】:Fetching the last post of the forum获取论坛的最后一个帖子
【发布时间】:2014-08-14 20:15:29
【问题描述】:

我建立了一个论坛系统,但在获取最后一个帖子时遇到了问题。

这里是查询:

SELECT 
    posts.date, posts.author AS pauthor, topics.*,
    CASE 
       WHEN posts.date > topics.date THEN posts.date 
       WHEN topics.date > posts.date THEN topics.date
    END AS ldate
FROM 
    posts, topics 
WHERE 
    topics.id = posts.topic_id 
    AND forum_id = ? 
ORDER BY 
    ldate DESC 
LIMIT 1

问题是当我打开一个新主题时,除非我对此主题发表评论,否则不会出现。

【问题讨论】:

  • 我不明白:如果你想要最后一个帖子,空主题应该没有关系,不是吗?
  • 所以问题可能出在显示主题的脚本中,而不是 MySQL 查询?
  • @didierc 我不会在每个论坛上显示最后一栏 无论是最后评论还是新闻主题。
  • @Tikky 脚本只显示查询结果。

标签: php sql


【解决方案1】:

这是用正确的join 语法和表别名重写的查询:

SELECT p.date, p.author AS pauthor, t.*,
       (CASE WHEN p.date > t.date THEN p.date 
             WHEN t.date > p.date THEN t.date
        END) AS ldate
FROM posts p JOIN
     topics t
     ON t.id = p.topic_id
WHERE forum_id = ?
ORDER BY ldate DESC
LIMIT 1;

您需要left outer join 和更多逻辑:

SELECT p.date, p.author AS pauthor, t.*,
       (CASE WHEN t.date IS NULL THEN p.date
             WHEN p.date > t.date THEN p.date 
             WHEN t.date > p.date THEN t.date
        END) AS ldate
FROM topics t LEFT JOIN
     posts p 
     ON t.id = p.topic_id
WHERE forum_id = ?
ORDER BY ldate DESC
LIMIT 1;

【讨论】:

  • 我猜想也许左连接可以解决问题,但我不明白:当主题为空时,它如何变成空结果集?
  • @didierc 。 . .我不明白你的问题。这应该会创建一个空的结果集。
  • 对不起,我的意思是,当最后创建的元素是主题而不是帖子时,它会产生空结果吗? (这似乎是 OP 想要的,但我不能确定)。
  • @didierc 。 . .前两列与帖子相关,不会是NULL。与该主题相关的列将是 NULL。这似乎是问题的意图。
  • 我不认为这就是 OP 的意思,我认为他实际上想要一个正确的连接,但否则你的查询当然是完美的。
【解决方案2】:

我将假设该帖子在数据库中但未显示在您想要的网页上。也许问题是 ORDER BY 将空值放在底部 so

ORDER BY ldate  IS NULL DESC, ldate  DESC

【讨论】:

    猜你喜欢
    • 2010-10-09
    • 1970-01-01
    • 1970-01-01
    • 2016-01-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多