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混用的坑

mysql中order by工作原理与调优

mysql_group by与聚合函数order by联合使用

Mysql order by与limit混用陷阱