【问题标题】:Ordering By Another Table Column If Exists按另一个表列排序(如果存在)
【发布时间】:2013-11-14 20:23:48
【问题描述】:

我正在整理一个包含主题/帖子的简单论坛脚本。我正在尝试通过最新帖子订购主题,并且我对以下问题的答案很幸运:MYSQL Order from another Table,但我遇到的问题是某些主题还没有任何帖子,所以查询没有'根本不选择那些主题。

当前编码为:

SELECT DISTINCT forum.* 
FROM forum 
INNER JOIN forum_posts 
      ON forum.id = forum_posts.parent_id 
GROUP BY forum.id 
ORDER BY forum_posts.parent_id DESC, 
         forum_posts.time_created DESC 
LIMIT ?,?

如果 forum_posts.parent_id 中没有某个主题的匹配项,我想告诉 ORDER BY 按 forum.time_created 排序。


顺便说一句,我也想知道如何将 WHERE 子句放入此查询中。我只想从论坛表“WHERE access where 将 sn-p 放入。

非常感谢任何帮助!


编辑:

目标是返回主题(来自论坛表) 根据以下细节:

  1. 在哪里 forum.access
  2. 限制?,?
  3. 订购 来自 forum_posts 表的最新帖子,其中 forum_posts.parent_id 与 forum.id 匹配, 或 forum.time_created

编辑 2:

一个包含相关数据的示例 SQLfiddle。这不起作用,因为订单应该真的是 11,10,9,1,2 http://sqlfiddle.com/#!2/83535/2

【问题讨论】:

  • 您需要将 OUTER JOIN,即 LEFT [OUTER] JOIN 与 GROUPWISE MAX 查询结合起来(手册中记录的不相关子查询示例通常最快)。
  • 感谢您的提示,对改进我的查询代码有帮助吗?

标签: php mysql sql


【解决方案1】:

看看这个:http://sqlfiddle.com/#!2/be909/1

这是我的最终查询:

SELECT forum.*, recent_forum_posts.time_created as latest_post
FROM forum 
LEFT JOIN (SELECT MAX(forum_posts.time_created) as time_created, forum_posts.parent_id
           FROM forum_posts
           GROUP BY forum_posts.parent_id) AS recent_forum_posts
        ON forum.id = recent_forum_posts.parent_id 
WHERE forum.access > 2
ORDER BY recent_forum_posts.time_created IS NULL DESC,
         recent_forum_posts.time_created DESC,
         forum.time_created DESC 
LIMIT 5

基本上,子查询(左连接后括号中的位)从forum_posts 表中为每个parent_id 选择最近的帖子。

然后左加入(因为我们想列出所有论坛的,即使还没有帖子)。

【讨论】:

  • 这很接近,但缺少的一点是,如果没有帖子,则顺序应默认为 forum.time_created。 sqlfiddle.com/#!2/3b2af/1 - 主题 3 应位于顶部的示例小提琴,因为创建日期是最新的,即使它没有帖子。
  • 在更大的表上性能会更差,但您可以添加一个额外的 ORDER BY 子句:sqlfiddle.com/#!2/0456f/1 - 我也会更新我的答案
  • 感谢您的更新。我正在使用 MySQLi,但收到警告:警告:mysqli_stmt::bind_result() [mysqli-stmt.bind-result]:绑定变量的数量与准备好的语句中的字段数量不匹配我检查过论坛表和绑定变量确实等于表中的全部列数。为什么这个查询可能与 mysqli 准备好的语句有问题?
  • 如果您使用该代码发布另一个问题,我可以看看,但这是 PHP 代码问题而不是 MySQL 查询问题。
  • 查询似乎在运行时在论坛表输出中添加了一个额外的字段,而该字段在 bind_result 中没有被选中。现在解决了。但是,它似乎仍然无法像在 sqlfiddle 上那样在我的系统上运行。我会再玩一些。感谢您的帮助:)
猜你喜欢
  • 2022-07-05
  • 1970-01-01
  • 1970-01-01
  • 2012-10-31
  • 2011-04-26
  • 1970-01-01
  • 2021-03-10
  • 2020-09-08
  • 1970-01-01
相关资源
最近更新 更多