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