web-dev-qa-db-fra.com

Comment trier le titre des éléments avec un ordre de tri naturel?

Lorsque vous avez dans une colonne une liste d'éléments tels que:

Title1
Title2
...
Title10
Title11

et vous filtrez sur Title (par ordre alphabétique), le résultat est le suivant:

Title1
Title10
Title11
Title2

Je veux que cela se fasse de manière naturelle, pour que les titres 10 et 11 arrivent à la fin. J'ai essayé d'utiliser $listOrder = natsort($listOrder); mais cela n'a aucun effet.

Y a-t-il un moyen d'y parvenir? Peut-être dans la requête SQL?

1
Franky

Pour mémoire, php's natsort () renvoie true ou false de sorte que votre $listOrder Sera toujours remplacé par true (sauf si quelque chose se trompe).


Si la partie principale de votre sélection de titres est identique et que le nombre correspond au (x) premier (s) caractère (s) à modifier, vous pouvez utiliser LOCATE() OR INSTR() sur le tiret en tant que condition de commande principale, puis sur la valeur complète en tant que condition secondaire dans votre clause ORDER BY.

Démo SQL :

Schéma:

CREATE TABLE `titles` (
  `title` varchar(255)
);

INSERT INTO `titles` VALUES
('Chapter 1 - Enter the Dragon'),
('Chapter 2 - The Dragon Is In Da House'),
('Chapter 3 - Firebreather'),
('Chapter 4 - Of Course You\'re A Girl Dragon'),
('Chapter 5 - Spread Your Wings'),
('Chapter 6 - A Visit From Smaug'),
('Chapter 7 - Draggin\' On'),
('Chapter 8 - The Egg'),
('Chapter 9 - Hatched'),
('Chapter 10 - More Fire'),
('Chapter 11 - OMG, Is The Dragon Still Here?'),
('Chapter 12 - The Dragon Has Left The Building');

Question:

SELECT LOCATE('-', title) AS position_of_hyphen, title FROM titles ORDER BY LOCATE('-', title), title

Joomla ORDER BY Syntax:

->order("LOCATE('-', title), title");
//                           ^^^^^- order ASC using full value if any ties to break
//       ^^^^^^^^^^^^^^^^^^- order ASC using the position of the earliest hyphen

Jeu de résultats:

| position_of_hyphen | title                                         |
| ------------------ | --------------------------------------------- |
| 11                 | Chapter 1 - Enter the Dragon                  |
| 11                 | Chapter 2 - The Dragon Is In Da House         |
| 11                 | Chapter 3 - Firebreather                      |
| 11                 | Chapter 4 - Of Course You're A Girl Dragon    |
| 11                 | Chapter 5 - Spread Your Wings                 |
| 11                 | Chapter 6 - A Visit From Smaug                |
| 11                 | Chapter 7 - Draggin' On                       |
| 11                 | Chapter 8 - The Egg                           |
| 11                 | Chapter 9 - Hatched                           |
| 12                 | Chapter 10 - More Fire                        |
| 12                 | Chapter 11 - OMG, Is The Dragon Still Here?   |
| 12                 | Chapter 12 - The Dragon Has Left The Building |

p.s. Pour tous ceux qui ne disposent pas d'un marqueur fiable tel que - Pour ancrer la logique de tri ... Le second espace existant peut être trouvé en démarrant la recherche après la position du premier espace avec LOCATE(' ', title, 9). Si vous ne connaissez pas la position des espaces à l'avance, mais que vous savez que vous voulez trouver la position du deuxième espace, vous pourriez utiliser: LOCATE(' ', title, LOCATE(' ', title) + 1)

p.p.s. Vous pouvez vous en tirer avec une seule condition de tri si vous extrayez la valeur numérique entière entre le premier et le deuxième espace et transformez la sous-chaîne en un entier. https://www.db-fiddle.com/f/ahk4r9YzVbrWzaCS99W8LT/2ORDER BY CAST(SUBSTRING_INDEX(SUBSTRING_INDEX(title, ' ', 2), ' ', -1) AS UNSIGNED) mais nous nous aventurons dans de plus en plus d'appels de fonction.

0
mickmackusa