列に次のようなアイテムのリストがある場合:
_Title1
Title2
...
Title10
Title11
_
Title
(アルファベット順)でフィルタリングすると、出力は次のようになります。
_Title1
Title10
Title11
Title2
_
タイトル10と11が最後になるように、自然な方法で並べ替えたいです。私は$listOrder = natsort($listOrder);
を使用しようとしましたが、これは効果がありません。
これを達成する方法はありますか?おそらくSQLクエリにありますか?
レコードの場合、phpの natsort() はtrue
またはfalse
を返すため、$listOrder
は常にtrue
として上書きされます(何かがない限り)エラー)。
選択したタイトルの先頭部分が同じで、番号が変更する最も早い文字である場合、LOCATE()
OR INSTR()
を使用できます。 ORDER BY
句のハイフンを1次順序条件として使用し、次に完全な値を2次条件として使用します。
SQLデモ :
スキーマ:
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');
クエリ:
SELECT LOCATE('-', title) AS position_of_hyphen, title FROM titles ORDER BY LOCATE('-', title), title
JoomlaのORDER BY構文:
->order("LOCATE('-', title), title");
// ^^^^^- order ASC using full value if any ties to break
// ^^^^^^^^^^^^^^^^^^- order ASC using the position of the earliest hyphen
結果セット:
| 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 |
pS並べ替えロジックをアンカーする-
のような信頼できるマーカーがない他の人のために... 2番目に出現するスペースは、最初のスペースの位置の後にLOCATE(' ', title, 9)
。スペースの位置が事前にわからないが、2番目のスペースの位置を知りたい場合は、couldを使用します。 LOCATE(' ', title, LOCATE(' ', title) + 1)
p.p.s.最初のスペースと2番目のスペースの間の数値全体を抽出し、部分文字列を整数としてキャストすると、単一のソート条件で済むようになります。 https://www.db-fiddle.com/f/ahk4r9YzVbrWzaCS99W8LT/2ORDER BY CAST(SUBSTRING_INDEX(SUBSTRING_INDEX(title, ' ', 2), ' ', -1) AS UNSIGNED)
しかし、その後、関数呼び出しの数を増やしています。