Maison  >  Questions et réponses  >  le corps du texte

Tri des résultats MySQL sur deux colonnes, mais avec une colonne "trou"

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粉118698740P粉118698740375 Il y a quelques jours376

répondre à tous(1)je répondrai

  • P粉141925181

    P粉1419251812023-09-12 09:02:45

    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

    répondre
    0
  • Annulerrépondre