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
然後添加列sort
到ORDER 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
如果你可以用字母排序突出顯示的行當中,雖然活着,就可以避免這些額外的複雜性。
我會建議將sql結果轉換爲可以進行任何類型轉換的數組。 –
你能爲我們定義*「高亮」*嗎? –
@ChaibiAlaanYeah在PHP中很容易將所有結果放在數組中,並用'in_array()'分開我需要的東西,保存在新的數組和顯示中,但這不是最優化的解決方案和不必要的循環。 –