我有两个要合并在一起的查询,以方便在后端处理结果。
基本结构是:
(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结果集中在一起?
我不希望整个合并结果集具有相同的排序。我试图获得一个列表,其中顶部有特殊/重要项目,然后是某些特定时间范围内的其他项目,如下所示,按日期/时间排序。
答案 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));
}
}