SQL左外连接影响子查询顺序

时间:2017-02-27 00:38:23

标签: mysql sql sql-order-by

我有一个包含子查询和许多左外连接的查询。在我的子查询中,我按最近blog_date的记录排序,并将结果限制为10条记录。此子查询应该规定记录的顺序,其他连接匹配有关该记录的其他信息,但是,当我添加LEFT OUTER JOIN时,它忽略了blog_date排序。这让我相信我要么缺少一个持久排序的关键元素,要么LEFT OUTER JOIN不是正确的联接使用。

以下是我的完整查询:

SELECT `b`.`blog_id`, `b`.`blog_date`,`b`.`title`, `u`.`user_id`, `u`.`first_name`, `c`.`category_name`, `d`.`discovery_source_name`, `bc`.`comment`, `bf`.`file`
FROM (SELECT * FROM `blog` ORDER BY `blog`.`blog_date` DESC limit 10) `b`
LEFT OUTER JOIN `user` `u` ON `b`.`user_id` = `u`.`user_id` AND `u`.`organization_id` = 1
LEFT OUTER JOIN `category` `c` ON `b`.`category_id` = `c`.`category_id`
LEFT OUTER JOIN `discovery_source` `d` ON `b`.`discovery_source_id` = `d`.`discovery_source_id`
LEFT OUTER JOIN `blog_comment` `bc` ON `b`.`blog_id` = `bc`.`blog_id`
LEFT OUTER JOIN `blog_file` `bf` ON `b`.`blog_id` = `bf`.`blog_id`
;

以下是我刚刚加入第一次加入(user)时记录按正确顺序排列的结果(2017-02-21最新版):

correct query

但是,当我添加第二个左外连接(并且剩余)时,新订单似乎按降序blog_date顺序排列,但随后按category_name分组。

incorrect order

1 个答案:

答案 0 :(得分:1)

对子查询进行排序不会影响外部查询的顺序。将ORDER BY放在外部查询的末尾。

SELECT `b`.`blog_id`, `b`.`blog_date`,`b`.`title`, `u`.`user_id`, `u`.`first_name`, `c`.`category_name`, `d`.`discovery_source_name`, `bc`.`comment`, `bf`.`file`
FROM (SELECT * FROM `blog` ORDER BY `blog`.`blog_date` DESC limit 10) `b`
LEFT OUTER JOIN `user` `u` ON `b`.`user_id` = `u`.`user_id` AND `u`.`organization_id` = 1
LEFT OUTER JOIN `category` `c` ON `b`.`category_id` = `c`.`category_id`
LEFT OUTER JOIN `discovery_source` `d` ON `b`.`discovery_source_id` = `d`.`discovery_source_id`
LEFT OUTER JOIN `blog_comment` `bc` ON `b`.`blog_id` = `bc`.`blog_id`
LEFT OUTER JOIN `blog_file` `bf` ON `b`.`blog_id` = `bf`.`blog_id`
ORDER BY `b`.`blog_date` DESC ;