【问题标题】:Order MySQL table by rotating values通过旋转值对 MySQL 表进行排序
【发布时间】:2012-08-19 12:07:20
【问题描述】:

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

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

【问题讨论】:

    标签: mysql repeat


    【解决方案1】:

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

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

    【讨论】:

    • 这几乎是我所需要的。我想知道,是否可以从每个组中只打印一行(假设我只设置两个组)然后重复?例如,第一组中只有一行,第二组中只有一行,等等。无论如何,您的回答对我有所帮助,因为现在我知道了基本想法。
    • @user1609926 在普通 SQL 中,一次从组中交替获取一行将变得更加困难。我可以想到一些使用临时表、联合和递增行号的方法,但这确实很复杂。在这种情况下,我可能会在您的应用程序代码中处理它。运行两个查询,一个针对 A,一个针对 B,然后循环遍历结果,从每个查询中交替获取一行。
    猜你喜欢
    • 2015-01-24
    • 1970-01-01
    • 2010-11-02
    • 1970-01-01
    • 2020-09-10
    • 2021-12-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多