1

我有电话号码表。我想按每个数字的开头对该表进行排序,但必须重复。例如,有如下行:

phone_number
0911226778
0905625238
0907952386
0904235582

前四位数字确定提供者。前缀 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

您可以通过获取 via 的前 4 个字符来执行此ORDER BY CASE操作: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() 在我拥有的地方替换其他前缀other_a等...。这样做是匹配前 4 个字符,如果它们在分配的排序组中,只需应用一个数字来排序。在上面的示例中,所有 0911、other_a、another_a 都将被赋予 1,因此排在 0905、other_b、another_b 和您碰巧分配的下一组 A 之前。

在这些组内,对phone_number.

我想我从您的问题中了解到,A 和 B 的前缀比您列出的 4 个要多。如果这不正确,您可以将IN()下面的子句替换为简单= '0904'的示例。

不幸的是,这种方法可能对索引不是很友好。如果性能不能满足您的需求,我建议将前缀作为 a 存储CHAR(4)在单独的列中(带有索引)并在ORDER BY.

于 2012-08-19T12:12:55.363 回答