带有独立ORDER BY排序的“ SELECT UNION SELECT”查询?

时间:2018-12-24 10:36:30

标签: sql mariadb union

我有两个要合并在一起的查询,以方便在后端处理结果。

基本结构是:

(SELECT * FROM table ORDER BY table.field DESC, table.timestamp DESC)
UNION ALL
(SELECT * FROM table ORDER BY table.timestamp DESC)

我忽略了WHERE子句,这些子句使这些查询以相同的形式返回完全不同的结果。问题是我添加到ORDER BY的内容不会改变其排序,并且排序不正确。实际上,两组似乎都在倒退。但是,即使我尝试按不相关的数字字段进行排序,顺序也不会改变。

也许UNION不是我想要的?是否有一种“笨拙”的方式将两个SQL结果集中在一起?

我不希望整个合并结果集具有相同的排序。我试图获得一个列表,其中顶部有特殊/重要项目,然后是某些特定时间范围内的其他项目,如下所示,按日期/时间排序。

5 个答案:

答案 0 :(得分:1)

我知道它很丑,但是尝试:

select a.* from (
(SELECT * FROM table ORDER BY table.field DESC, table.timestamp DESC)
) a
UNION ALL
select b.* from (
(SELECT * FROM table ORDER BY table.timestamp DESC)
) b

注意:我想您已经知道使用Union会得到重复的结果

答案 1 :(得分:0)

如果我理解正确,则可以尝试在子查询中创建一个grp列以表示两个结果order by顺序。

SELECT t1.*
FROM (
    SELECT *,1 grp 
    FROM table 
    ORDER BY 
    UNION ALL
    SELECT *,2 
    FROM table 
) t1
ORDER BY t1.grp,t1.field DESC, t1.timestamp DESC

答案 2 :(得分:0)

where中包含order by条件。像这样:

select t.*
from t
where (<1>) or (<2>)
order by (<1>) desc,  -- put the "1" rows first
         (case when <1> then t.field desc end),
         t.timestamp asc;

答案 3 :(得分:0)

“为什么” :根据定义,子查询返回无序的行集。优化器只是最近才开始利用标准中的该子句。这样做会丢掉{ width: 100%, height: auto; } (除非有public partial class frmMain : Form { //scintillaControl is the user control List<scintillaControl> controls = new List<scintillaControl>(); private void NewTab() //called when 'New File is pressed' { scintillaControl newsc = new scintillaControl(); newsc.Dock = DockStyle.Fill; controls.Add(newsc); TabPage newTab = new TabPage(); newTab.Controls.Add(newsc); tabCtrl.TabPages.Add(newTab); } private void CutMethod() { int selectedTab = tabCtrl.SelectedIndex; scintillaControl sc = controls[selectedTab]; sc.txtEditor.Cut(); } } ;请参阅计划A)。您看到的顺序只是巧合,可能基于满足ORDER BY的索引。为了正确地对结果进行排序,您之后必须应用一些排序(请参阅计划B)。

另一个最近的优化...以前,LIMIT 总是将每个子查询的结果馈送到临时表中。现在,对于WHERE(以及其他一些限制),它可以将结果直接提供给客户端。 (但是,我建议的计划B和C仍然需要一个临时表才能执行UNION。)

计划A 可能有效的证据:

UNION ALL

计划B 可能有效,具体取决于ORDER BY是否适合数据:

(SELECT * FROM table ORDER BY table.field DESC, table.timestamp DESC
                     LIMIT 9999999)
UNION ALL
(SELECT * FROM table ORDER BY table.timestamp DESC
                     LIMIT 9999999)

计划C 是对计划B的概括:

ORDER BY

底线。要获得订单,您必须明确拥有(SELECT * FROM table) UNION ALL (SELECT * FROM table) ORDER BY table.field DESC, table.timestamp DESC 。 (当前,您要依序完成(SELECT *, 1 AS seq1, table.field AS seq2 FROM table) UNION ALL (SELECT *, 2 AS seq1, 0 AS seq2 FROM table) ORDER BY seq1, -- to get the first SELECT first seq2 DESC, -- unclear what your intent was with table.field timestamp DESC 个片段。有一天ORDER BY可以并行完成。)

答案 4 :(得分:0)

内部命令cluser不影响输出结果。 您必须使用Order Out Of union。

for (let i = -1; i++ < 100; i * 5) {
  if (i < 0) {
    continue;
  } else if (i > 50) {
    break;
  } else {
    console.log(Math.floor(i / 5));
  }
}