2009-12-03 64 views
2

假設我有一個數據庫表,其中包含有關美國各城市的信息。我的顯示器顯示像下面首先由國家,然後郡分組信息,最後通過市東西:在MySQL中按單行標準排序行數組?


  • 阿拉巴馬
    • 奧陶加縣
    • 城市1
    • 城市2
    • 鮑德溫縣
    • 城市1
    • 城市2
    • 縣等
  • 阿拉斯加
    • 阿拉斯加縣1
    • 城市1
    • 阿拉斯加縣2

查詢看起來是這樣的:

select * from myInfo order by state, county, city 

一個新的皺紋是所有國家包含稱爲「林肯」的城市應該首先命令州和縣。沒有名爲林肯的城市將在之後訂購。理想的結果是一樣的東西:

  • 內布拉斯加州
    • 蘭開斯特縣
    • 林肯
    • 一些其他的蘭開斯特市
    • 其他一些內布拉斯加縣
  • 新墨西哥州
    • 林肯縣
    • 林肯
    • 其他一些城市
    • 其他一些縣
  • 一個非林肯國家

我能做到在代碼中這個複雜的排序,但我不知道它是多麼的困難在純SQL來實現。結果查詢有多困難?

回答

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 

如果由於某種原因,你的數據庫中有一個名爲「林肯」具有相同(州,縣)對多個城市,加上DISTINCT的組合。或者更好,請確保您的數據庫中沒有重複的行,方法是在(state, county, city)上添加UNIQUE密鑰

0

...在純SQL實現。

我看到兩種可能的方式。

1)在COUNTY列中添加IIF()函數,並通過該函數進行排序,如IIF(COUNTY =「Lincoln County」,1,2) - 您使用IIF()來「覆蓋」按字母順序替換爲「1」或「2」。

2)用字段(COUNTY_ID,COUNTY_NAME,SEQUENCE)創建另一個表,指定您想要的特定序列。然後,加入到這個表,並添加序列與ORDER BY子句

選項2,需要提前知道你所有的縣。但優點是您可以添加更復雜的排序規則,比嵌套的IIF()子句更易於理解/維護。

0

另一件事你可以嘗試如下:

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

(city != 'Lincoln')會給你一個額外的柱,1所在城市名稱林肯值,然後將這些行會拋出的在訂單頂部。