在MySQL中按单行标准排序行组?

时间:2009-12-03 22:58:21

标签: mysql sql-order-by

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


  • 阿拉巴马
    • Autauga County
    • city 1
    • city 2
    • 鲍德温县
    • city 1
    • city 2
    • 县等
  • 阿拉斯加
    • 阿拉斯加县1
    • city 1
    • 阿拉斯加县2

查询看起来像:

select * from myInfo order by state, county, city

一个新的皱纹是,所有包含名为“林肯”的城市的州都应首先订购州和县。没有名为林肯的城市的国家将被命令。期望的结果如下:

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

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

3 个答案:

答案 0 :(得分:0)

  

...在纯sql中实现。

我看到两种可能的方式。

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

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

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

答案 1 :(得分:0)

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

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

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

答案 2 :(得分:0)

假设你的数据库没有规范化,我的方法就是这样:从表中选择所有内容,添加一个自联接,看看(州,县)对是否有一个名为'Lincoln'的城市,并先对它们进行排序。

   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

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