Tri des résultats MySQL sur deux colonnes, mais avec une colonne "trou"
P粉118698740
P粉118698740 2023-09-11 12:14:50
0
1
414

Ma situation initiale est la suivante :

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

Vous pouvez générer ce tableau via le schéma suivant :

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

Le but est que chaque ligne ne contienne pas NULL forcedRank 列的行放置在此 forcedRank à la position exacte mentionnée dans la colonne. Le rendu attendu est le suivant :

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

Comme vous pouvez le voir, si elle n'est pas NULL, chaque ligne est prise lorsqu'elle est triée par la colonne forcedRank 列排序的位置。当 NULL 行仍然按 legacyRank à une position non occupée par une ligne non NULL, mais la ligne forcée n'est jamais déplacée.

Suite à cet ordre, j'ai essayé en ORDER BY 中使用 CASE WHEN la syntaxe comme celle-ci :

SELECT * FROM two_column_order

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

  -`forcedRank` DESC,
  `legacyRank`

Mais les résultats n’ont pas vraiment répondu à mes attentes :

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

Alors, comment puis-je trier les colonnes legacyRank au-delà des lignes de classement forcé sans les déplacer ?

P粉118698740
P粉118698740

répondre à tous(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
classement hérité Classement forcé
0 vide
1 vide
4 1
6 2
3 vide
5 vide
2 6
7 vide

Violon

Parce que la première réponse ne vous donnera pas la bonne réponse.

J'ai modifié l'ordre en ajoutant un point décimal au nombre d'origine afin qu'il soit plus grand que le nouveau classement forcé.

Il maintiendra l'ordre et forcera les nombres à être plus petits que le classement traditionnel et il obtiendra le résultat suivant

SELECT * FROM two_column_order
order by
  CASE when `forcedRank`  IS NOT NULL THEN `forcedRank` 
  ELSE `legacyRank` + .1
  END
classement hérité Classement forcé
0 vide
4 1
1 vide
6 2
3 vide
5 vide
2 6
7 vide

Violon

Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal