【发布时间】:2017-10-11 07:56:02
【问题描述】:
我有一个案例,我从另一个 select 执行 select,如果我添加 where 子句,则返回行的顺序会更改。
例子:
SELECT t.id
FROM (
SELECT t.id
FROM table1 t
ORDER BY
t.viewsTotal ASC
LIMIT 20
OFFSET 0
) base
INNER JOIN table1 t ON base.id = t.id
LEFT JOIN table2 t2 ON t2.id = t1.secondTableId
# WHERE t2.someBoolColumn = FALSE
;
现在,内部select 和外部select 的顺序相同,但如果我取消注释where 条件,外部select 将改变顺序。
如何防止这种情况发生?
让我们假设给定示例如下:
- 我一个也做不了
select。 - 我不知道在执行外部
select时对内部select应用了什么顺序。所以,如果我从一个连接的表中订购,我不会知道我需要在这里加入它。
关于我的用例的更多信息
有一个提供内部选择的查询构建器,它可以通过连接到该内部选择的第三个表应用顺序,如果我想应用相同的顺序,我需要知道哪些表被连接,并且对于这个糟糕的查询生成器,我没有这些知识
【问题讨论】:
-
在外部
SELECT上应用ORDER BY。 -
@RemyLebeau 这是有问题的,因为我不知道内部选择的应用顺序,如果通过任何连接进行排序,我也必须在外部选择上加入这些表,但我没有在外部选择阶段了解它
-
没有“行顺序”,除非您使用 ORDER BY 子句。它是未定义的。任何事情都会影响它。
-
@Vardius:我不明白你在说什么。内部
select以某种方式对行进行排序,因此它知道要返回什么。外部select执行的任何连接都不会更改该顺序。内部select只返回一些行,而外部select如果取消注释where,则将其中的一些过滤掉。它还应该根据需要对剩余的行进行排序。所以没有理由不在外部select上使用ORDER BY,不管内部select如何排序初始行。 -
@Vardius:外部
select无法知道内部select的顺序,除非您对所有内容进行硬编码,因此selects 都使用相同的排序标准。你似乎不知道。所以外部select需要它自己的ORDER BY来订购它想要的最终结果,不管内部select如何订购。
标签: mysql sql sql-order-by query-builder