我有电话号码表。我希望在每个数字的开头对该表进行排序,但必须重复。例如,有如下行:
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子句进行少量更改。 提前谢谢。
答案 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>