Sortieren der MySQL-Ergebnisse nach zwei Spalten, jedoch mit einer „Loch'-Spalte
P粉118698740
P粉118698740 2023-09-11 12:14:50
0
1
415

Meine Ausgangssituation ist wie folgt:

  +------------+-------------+
  | legacyRank | forcedRank  |
  +------------+-------------+
  | 0          | NULL        |
  | 1          | 6           |
  | 2          | NULL        |
  | 3          | 1           |
  | 4          | NULL        |
  | 5          | NULL        |
  | 6          | 2           |
  +------------+-------------+

Sie können diese Tabelle über das folgende Schema generieren:

CREATE TABLE two_column_order (
  legacyRank VARCHAR(45),
  forcedRank VARCHAR(45)
);

INSERT INTO two_column_order (legacyRank, forcedRank)
VALUES (5, NULL); 
INSERT INTO two_column_order (legacyRank, forcedRank)
VALUES (6, 2); 
INSERT INTO two_column_order (legacyRank, forcedRank)
VALUES (7, NULL); 
INSERT INTO two_column_order (legacyRank, forcedRank)
VALUES (0, NULL); 
INSERT INTO two_column_order (legacyRank, forcedRank)
VALUES (1, NULL); 
INSERT INTO two_column_order (legacyRank, forcedRank)
VALUES (2, 6); 
INSERT INTO two_column_order (legacyRank, forcedRank)
VALUES (3, NULL); 
INSERT INTO two_column_order (legacyRank, forcedRank)
VALUES (4, 1); 


SELECT * FROM two_column_order
order by
  CASE when `forcedRank`  <> NULL THEN `forcedRank`
  ELSE `legacyRank`
  END

Das Ziel besteht darin, dass jede Zeile nicht NULL forcedRank 列的行放置在此 forcedRank an der genauen Position enthält, die in der Spalte angegeben ist. Das erwartete Rendering ist wie folgt:

  +------------+-------------+
  | legacyRank | forcedRank  |
  +------------+-------------+
0 | 0          | NULL        |
1 | 3          | 1           |
2 | 6          | 2           |
3 | 2          | NULL        |
4 | 4          | NULL        |
5 | 5          | NULL        |
6 | 6          | 6           |
  +------------+-------------+

Wie Sie sehen können, wird jede Zeile, wenn sie nicht NULL ist, beim Sortieren nach der forcedRank 列排序的位置。当 NULL 行仍然按 legacyRank-Spalte an einer Position übernommen, die nicht von einer Nicht-NULL-Zeile besetzt ist, aber die erzwungene Zeile wird nie verschoben.

In dieser Reihenfolge habe ich es in ORDER BY 中使用 CASE WHEN einer Syntax wie dieser versucht:

SELECT * FROM two_column_order

order by 
  CASE WHEN (`forcedRank` is NULL )  THEN `legacyRank`
  END ,

  -`forcedRank` DESC,
  `legacyRank`

Aber die Ergebnisse entsprachen nicht wirklich meinen Erwartungen:

+------------+-------------+
| legacyRank | forcedRank  |
+------------+-------------+
| 3          | 1           |
| 6          | 2           |
| 6          | 6           |
| 0          | NULL        |
| 2          | NULL        |
| 4          | NULL        |
| 5          | NULL        |
+------------+-------------+

Wie kann ich also die Reihenfolge der legacyRank Spalten über die ForcedRank-Zeilen hinaus festlegen, ohne sie zu verschieben?

P粉118698740
P粉118698740

Antworte allen(1)
P粉141925181

NULL 不能像您需要使用 IS 那样进行比较,或者在您的情况下使用 IS NOT

SELECT * FROM two_column_order
order by
  CASE when `forcedRank`  IS NOT NULL THEN `forcedRank`
  ELSE `legacyRank`
  END
legacyRank 强制排名
0
1
4 1
6 2
3
5
2 6
7

小提琴

因为第一个答案不会给你正确的答案。

我通过在原始数字上添加小数点来更改顺序,以便它比新的强制排名更大。

它将保持顺序,并且强制数字小于传统排名,它会得到以下结果

SELECT * FROM two_column_order
order by
  CASE when `forcedRank`  IS NOT NULL THEN `forcedRank` 
  ELSE `legacyRank` + .1
  END
legacyRank 强制排名
0
4 1
1
6 2
3
5
2 6
7

小提琴

Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage