it-swarm-eu.dev

Come ordinare il titolo degli articoli con un ordinamento naturale?

Quando hai in una colonna un elenco di elementi come:

Title1
Title2
...
Title10
Title11

e filtri su Title (in ordine alfabetico), l'output è simile a:

Title1
Title10
Title11
Title2

Voglio che sia ordinato in modo naturale, in modo che i titoli 10 e 11 arrivino alla fine. Ho provato a usare $listOrder = natsort($listOrder); ma questo non ha alcun effetto.

C'è un modo per raggiungere questo obiettivo? Forse nella query SQL?

1
Franky

Per la cronaca, php's natsort () restituisce true o false quindi il tuo $listOrder Verrà sempre sovrascritto come true (a meno che qualcosa non va).


Se la parte principale della selezione dei titoli è identica e il numero è il primo carattere da modificare, è possibile utilizzare LOCATE() OR INSTR() sul trattino come condizione dell'ordine primario e quindi il valore completo come condizione secondaria nella clausola ORDER BY.

Demo SQL :

Schema:

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');

Query:

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

Joomla ORDER BY Sintassi:

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

Set di risultati:

| 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 |

post scriptum Per chiunque non abbia un indicatore affidabile come - Per ancorare la logica di ordinamento a ... Il secondo spazio che si trova può essere trovato avviando la ricerca dopo la posizione del primo spazio con la funzione LOCATE(' ', title, 9). Se non conosci in anticipo la posizione degli spazi, ma sai di voler trovare la posizione del secondo spazio, puoi utilizzare : LOCATE(' ', title, LOCATE(' ', title) + 1)

p.p.s. È possibile cavarsela con una singola condizione di ordinamento se si estrae l'intero valore numerico tra il primo e il secondo spazio e si esegue il cast della sottostringa come numero intero. https://www.db-fiddle.com/f/ahk4r9YzVbrWzaCS99W8LT/2ORDER BY CAST(SUBSTRING_INDEX(SUBSTRING_INDEX(title, ' ', 2), ' ', -1) AS UNSIGNED) ma poi ci stiamo avventurando in sempre più chiamate di funzione.

0
mickmackusa