2016-01-30 20 views
1

我擁有世界上所有國家的數據庫,從A-Z排序,我的客戶要求我在選項列表中排第一位。怎麼做?MySQL:Hilight很少有結果像第一個進入列表

我的領域是idcountry_codecountry_name

Curret查詢:

SELECT * FROM countries ORDER BY country_name ASC 

名單是標準的HTML選擇/選項列表,我需要(通過COUNTRY_CODE)UKUSCA像顯示列表中的第一個選項,然後是AZ的其他國家。

謝謝!

+1

我會建議將sql結果轉換爲可以進行任何類型轉換的數組。 –

+1

你能爲我們定義*「高亮」*嗎? –

+0

@ChaibiAlaanYeah在PHP中很容易將所有結果放在數組中,並用'in_array()'分開我需要的東西,保存在新的數組和顯示中,但這不是最優化的解決方案和不必要的循環。 –

回答

2

ORDER BY子句可以包含任意的表達式 - 它不需要限制爲列名。您可以使用ORDER BY中的IN()爲您想要突出顯示的值分配低值(0),對其餘值分配較高值(1)。按照您的排序順序country_name ASC,這兩個組將按字母順序排序。

這是可行的,因爲0分配給IN()列表中的那些,而1分配給其餘的。 0總是排在1之前。

SELECT * 
FROM countries 
ORDER BY 
    CASE 
    -- Assign lower sort values to the specified list 
    WHEN country_code IN ('UK','US','CA') THEN 0 
    -- And higher sort values to others 
    ELSE 1 
    END ASC, 
    -- Sub-sort by name 
    country_name ASC 

這裏是一個簡短的演示:http://sqlfiddle.com/#!9/2d0cc/1

如果需要突出顯示的設置(如強迫UK是第一爲例)指定其他排序,可以通過添加另一列進行到表中給予排序偏好,而不是依靠字母順序的子排序。將較低的值分配給您想要的值,並且未加亮的值可以保持爲NULL

code, name,   sort 
UK, United Kingdom, 1 
CA, Canada,   2 
FR, France   NULL 
RU, Russia   NULL 
US, United States 3 

然後添加列sortORDER BY

ORDER BY 
    CASE 
    WHEN country_code IN ('UK','US','CA') THEN 0 
    ELSE 1 
    END ASC, 
    -- Sub-sort by the new "sort" column to force ordering 
    sort ASC, 
    -- Finally sort alphabetically for all those without 
    -- specific sort values 
    country_name ASC 

如果你可以用字母排序突出顯示的行當中,雖然活着,就可以避免這些額外的複雜性。

+0

WOOW這是強大的。謝謝!這是我尋找的解決方案。 –

+0

@IvijanStefanStipić很高興我能幫到你。祝你好運。 –

+1

非常感謝,以下是我的結果:http://prntscr.com/9x81zc –

相關問題