1

電話番号のテーブルがあります。そのテーブルを各番号の先頭で並べ替えたいのですが、繰り返す必要があります。たとえば、次のような行があります。

phone_number
0911226778
0905625238
0907952386
0904235582

最初の 4 桁でプロバイダーが決まります。0911 と 0904 のプレフィックスはプロバイダー A に属し、0905 と 0907 はプロバイダー B に属します。プロバイダーに基づいて電話番号に従ってテーブルを並べ替えたいと思います。私が望むのは、A、B、A、B などのようなテーブルを注文することです。ここで、「A」は「B」と同様に一連のプレフィックスを表します。したがって、望ましい順序は次のようになります。

phone_number
0911226778
0905625238
0904235582
0907952386

UNION ステートメントなどを使用した例を見つけました。問題は、php スクリプト内の非常に複雑なクエリを変更したいということです。私は熟練していないので、ORDER BYステートメントを使用するか、WHERE句を少し変更するだけでそれを行う簡単な方法を見つけたいです。前もって感謝します。

4

1 に答える 1

0

viaORDER BY CASEの最初の 4 文字を取る場所でこれを行うことができます。phone_numberLEFT(phone_number, 4)

SELECT
  phone_number
FROM yourtable
ORDER BY
  CASE
    /* first group of A prefixes */
    WHEN LEFT(phone_number, 4) IN ('0911','other_a','another_a') THEN 1
    /* first group of B prefixes */
    WHEN LEFT(phone_number, 4) IN ('0905','other_b','another_b') THEN 2
    /* second group of A prefixes */
    WHEN LEFT(phone_number, 4) IN ('0904','some_a','someother_a') THEN 3
    /* second group of B prefixes */
    WHEN LEFT(phone_number, 4) IN ('0907','some_b','someother_b') THEN 4
    ELSE 5
  END ASC,
  phone_number ASC

IN() where I have内の他の接頭辞に置き換えother_aます。これにより、最初の 4 文字が一致し、それらが割り当てられた並べ替えグループにある場合は、番号を適用して並べ替えることができます。上記の例では、すべての 0911、other_a、another_a に 1 が与えられるため、0905、other_b、another_b、およびたまたま割り当てた A の次のグループの前に並べ替えられます。

これらのグループ内では、通常の昇順ソートが適用されphone_numberます。

あなたの質問から、あなたがリストした4つよりも多くのAとBの接頭辞があることを理解していると思います. それが正しくない場合は、IN()以下の句を単純な= '0904'例に置き換えることができます。

残念ながら、この方法は索引付けにはあまり適していない可能性があります。パフォーマンスがニーズを満たさない場合は、接頭辞を としてCHAR(4)別の列 (インデックス付き) に保存し、それを で使用することをお勧めしORDER BYます。

于 2012-08-19T12:12:55.363 に答える