通过旋转值来订购MySQL表

时间:2012-08-19 12:07:20

标签: mysql repeat

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

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子句进行少量更改。 提前谢谢。

1 个答案:

答案 0 :(得分:0)

您可以通过ORDER BY CASE执行此操作,您可以通过phone_number获取LEFT(phone_number, 4)的前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'条款。

遗憾的是,这种方法对索引不是很友好。如果性能不能满足您的需求,我建议将前缀作为CHAR(4)存储在单独的列(带索引)中,并在ORDER BY中使用。{/ p>