MySQL ORDER BY 字段与切换
Posted
技术标签:
【中文标题】MySQL ORDER BY 字段与切换【英文标题】:MySQL ORDER BY field with a toggle 【发布时间】:2019-10-29 01:30:32 【问题描述】:我有一个如下所示的 mysql 结果:
| compare | field1 | field2 | much more |
-----------------------------------------
| new | x1 | y | ... |
| old | x1 | y | ... |
| old | x2 | y | ... |
| new | x2 | y | ... |
查询搜索两个表(新表和旧表)的差异,并按字段 1 对其进行排序(字段更多,但在这里简单点)。所以,查询返回的一切都是正确的,但只有一件事:在查询中,有一个 UNION ALL 与 FIRST fetch old,然后 UNION ALL 它到 SECOND new。
我想要的是一个结果,我的“比较”总是先是旧的,然后是新的。但是看看我的结果,有时我先得到新的,这会破坏其余的代码。
我试过了
ORDER BY FIELD(compare, 'old', 'new'), ...
但它不起作用。
有人有想法吗? 结果应该是这样的:
| compare | field1 | field2 | much more |
-----------------------------------------
| old | x1 | y | ... |
| new | x1 | y | ... |
| old | x2 | y | ... |
| new | x2 | y | ... |
编辑#1:
这是完整的查询:
SELECT
MIN(compareTables) AS 'table',
CONCAT(ObjNr, PFKt, WhgNr, DatVon, AdrNr, KEY_Firma) AS 'primary',
ObjNr,
PFKt,
WhgNr,
DatVon,
DatBis,
AdrNr,
KEY_Firma,
Info,
PKto,
FI_MieterPKto,
PFktArtEigMiet,
ST_SchlAustriaPKto,
inaktiv,
inaktivBis
FROM ((SELECT
'old' AS compareTables,
ObjNr,
PFKt,
WhgNr,
DatVon,
DatBis,
AdrNr,
KEY_Firma,
Info,
PKto,
FI_MieterPKto,
PFktArtEigMiet,
ST_SchlAustriaPKto,
inaktiv,
inaktivBis
FROM table_old.PF_PFkt) UNION ALL (SELECT
'new' AS compareTables,
ObjNr,
PFKt,
WhgNr,
DatVon,
DatBis,
AdrNr,
KEY_Firma,
Info,
PKto,
FI_MieterPKto,
PFktArtEigMiet,
ST_SchlAustriaPKto,
inaktiv,
inaktivBis
FROM table_new.PF_PFkt)) AS compareTables
WHERE 'primary' IS NOT NULL
GROUP BY ObjNr,
PFKt,
WhgNr,
DatVon,
DatBis,
AdrNr,
KEY_Firma,
Info,
PKto,
FI_MieterPKto,
PFktArtEigMiet,
ST_SchlAustriaPKto,
inaktiv,
inaktivBis
HAVING COUNT(*) = 1
ORDER BY ObjNr, PFKt, WhgNr, DatVon, AdrNr, KEY_Firma
和部分结果
【问题讨论】:
【参考方案1】:field1
的第一个订单。然后按compare
降序排列,在new之前得到old。
ORDER BY field1, compare DESC
【讨论】:
不起作用,抱歉。 field1 将有不止一次相同的内容(例如,field 1 是一个值为 10 的 planeid,当对同一平面进行多次更改时,它出现的频率更高)。 我试过了,它打破了新旧归属的顺序 看来您需要更好的样本数据来说明实际问题。 试想一下,在我的第一篇文章中,field1 可以有相同的数据,field2 也可以,但是变化是在 field_x 中,我不知道有多少字段(它是一个动态 sql 生成器,用于几个问题) 这绝对是对您上面提出的问题的正确答案,如果它没有帮助,那么您没有正确提出问题。您应该提供更好的样本数据【参考方案2】:你想要这样的东西:
order by field1, field2, (compare = 'OLD') DESC
【讨论】:
不,抱歉,这将首先给我所有“旧”,然后是所有“新”,但这必须始终先切换“旧”;) @圣骑士。 . .不,这不是这样做的。compare
的条件是order by
中的第三个键。
我的编辑器中有 SQL,我在 orderby 的第三个位置用你的更改触发了它,结果首先是“旧”,然后是“新”【参考方案3】:
试试这个:
order by (field1, field2 DESC), compare = 'OLD' DESC
【讨论】:
这不起作用,我收到一条错误消息Operand should contain 1 column(s)
以上是关于MySQL ORDER BY 字段与切换的主要内容,如果未能解决你的问题,请参考以下文章
MySql 你知道 order by 是怎么回事吗? MySql全字段排序与 rowid 排序
Mysql order by 不唯一字段与limit混用的坑
Mysql order by 不唯一字段与limit混用的坑