【问题标题】:Ordering Groups of Rows by Single Row Criteria in MySQL?在 MySQL 中按单行标准对行组进行排序?
【发布时间】:2010-12-23 01:16:48
【问题描述】:

假设我有一个包含美国各个城市信息的数据库表。我的显示首先按州分组显示信息,然后按县分组,最后按城市分组,如下所示:


  • 阿拉巴马州
    • 奥托加县
    • 城市 1
    • 城市2
    • 鲍德温县
    • 城市 1
    • 城市2
    • 县等
  • 阿拉斯加
    • 阿拉斯加县 1
    • 城市 1
    • 阿拉斯加县 2

查询看起来像:

select * from myInfo order by state, county, city

一个新的问题是,所有包含名为“林肯”的城市的州都应首先对其州和县进行排序。没有名为林肯的城市的州将被订购。期望的结果是这样的:

  • 内布拉斯加州
    • 兰开斯特县
    • 林肯
    • 其他一些兰开斯特市
    • 其他一些内布拉斯加州县
  • 新墨西哥州
    • 林肯县
    • 林肯
    • 其他城市
    • 其他县
  • 非林肯州

我可以在代码中进行这种复杂的排序,但我想知道在纯 sql 中实现有多么困难。生成的查询有多难?

【问题讨论】:

    标签: mysql sql-order-by


    【解决方案1】:

    假设您的数据库未标准化,我将按照以下步骤进行操作:从表中选择所有内容,添加一个自联接以查看(州、县)对是否有一个名为“林肯”的城市,然后首先对它们进行排序。

       SELECT t1.*, (t2.state IS NOT NULL) AS has_lincoln
         FROM myInfo t1
    LEFT JOIN myInfo t2 ON (t2.state, t2.county, t2.city)
                         = (t1.state, t1.county, 'Lincoln')
     ORDER BY t1.state, has_lincoln DESC, t1.county, t1.city
    

    如果出于某种原因,您的数据库中有多个名为“林肯”的城市具有相同的(州、县)对,请将 DISTINCT 添加到组合中。或者更好的是,通过在 (state, county, city) 上添加 UNIQUE 键来确保数据库中没有重复的行

    【讨论】:

      【解决方案2】:

      ... 在纯 sql 中实现。

      我看到了两种可能的方法。

      1) 在 COUNTY 列上添加 IIF() 函数并按该函数排序,例如 IIF(COUNTY="Lincoln County", 1, 2) - 您正在使用 IIF() 来“覆盖”字母通过将其替换为“1”或“2”来进行排序。

      2) 创建另一个表,其中包含指定所需特定序列的字段(COUNTY_ID、COUNTY_NAME、SEQUENCE)。然后加入该表并将 SEQUENCE 添加到 ORDER BY 子句

      选项 2 需要提前了解您的所有县。但优点是您可以添加比嵌套的 IIF() 子句更容易理解/维护的更复杂的排序规则。

      【讨论】:

        【解决方案3】:

        您可以尝试的另一件事是:

        SELECT *, (city != 'Lincoln') AS test
        FROM myInfo
        ....
        ORDER BY test, state, county, city
        

        (city != 'Lincoln') 将为您提供一个值为 1 的附加列,其中城市名称​​是林肯,然后这些行将被扔到 ORDER 的顶部。

        【讨论】:

          猜你喜欢
          • 2016-12-29
          • 1970-01-01
          • 1970-01-01
          • 2014-03-12
          • 1970-01-01
          • 1970-01-01
          • 2020-01-23
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多