如果存在,则按另一个表列排序

时间:2013-11-14 09:31:03

标签: php mysql sql

我正在整理一个包含主题/帖子的简单论坛脚本。我正在尝试通过最新帖子订购主题,我在以下问题中得到了一些运气: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中没有匹配项,我想通过forum.time_created告诉ORDER BY订购。


另外,我还想知道如何将WHERE子句放入此查询中。我想只从论坛表“WHERE access< =?”获取行,但无法解决 where 将该片段放入。

非常感谢任何帮助!


修改

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

  1. WHERE forum.access< =?
  2. LIMIT?,?
  3. ORDER BY 来自forum_posts表的最新帖子,在forum.id上有forum_posts.parent_id匹配, 或forum.time_created

  4. 编辑2:

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

1 个答案:

答案 0 :(得分: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

基本上,子查询(LEFT JOIN之后括号中的位)从parent_id表中选择每个forum_posts的最新帖子。

那就是LEFT JOINed(因为我们想要列出所有论坛的内容,即使还没有帖子)。