web-dev-qa-db-ja.com

自然なソート順でアイテムのタイトルをソートする方法は?

列に次のようなアイテムのリストがある場合:

_Title1
Title2
...
Title10
Title11
_

Title(アルファベット順)でフィルタリングすると、出力は次のようになります。

_Title1
Title10
Title11
Title2
_

タイトル10と11が最後になるように、自然な方法で並べ替えたいです。私は$listOrder = natsort($listOrder);を使用しようとしましたが、これは効果がありません。

これを達成する方法はありますか?おそらくSQLクエリにありますか?

1
Franky

レコードの場合、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)しかし、その後、関数呼び出しの数を増やしています。

0
mickmackusa