2009-07-03 76 views
9

我有一個MySQL表數據如下(簡化):排序某些值頂端

INSERT INTO `stores` (`storeId`, `name`, `country`) VALUES 
(1, 'Foo', 'us'), 
(2, 'Bar', 'jp'), 
(3, 'Baz', 'us'), 
(4, 'Foo2', 'se'), 
(5, 'Baz2', 'jp'), 
(6, 'Bar3', 'jp'); 

現在,我希望能夠得到與客戶國開始商店的分頁列表。

例如,美國消費者將看到以下列表:

Foo 
Baz 
Bar 
Foo2 
Baz2 
Bar3 

我現在使用的天真的解決方案(與美國客戶和頁面大小3例):

(SELECT * FROM stores WHERE country = "us") UNION (SELECT * FROM stores WHERE country != "us") LIMIT 0,3 

有沒有更好的方法來做到這一點?是否可以使用ORDER BY並將其置於頂部?

回答

15

試試這個:

SELECT * FROM stores ORDER BY country = "us" DESC, storeId 
+0

啊,這正是我所要找的,謝謝 – truppo 2009-07-03 12:17:23

1

你有一個國家的每一個值以數字聯繫起來,用一個案例:在查詢以便通過國家

select * 
from stores 
order by case when country = "us" then 1 
       else 0 
     end desc 
1

創建國家代碼和訂單表,連接到這裏,然後代碼的順序。

所以,你將有一個表,看起來像

CountryOrder 

Code Ord 
---- --- 
us 1 
jp 2 
se 3 

,然後代碼看起來像:

SELECT s.* 
FROM Stores s 
INNER JOIN CountryOrder c 
    ON c.Code = s.Country 
ORDER BY c.Ord; 
1

如何使用IF頂端值分配給美國行。

select if(country_cd='us,'aaaUS',country_cd) sort_country_cd, country_cd from stores Order by sort_country_cd 

這會給你叫sort_country_cd僞列。 在這裏您可以將「美國」映射到「aaaUS」。 JP仍然可以映射到JP

這使美國排在您的排序清單的頂部。

+0

SELECT COUNTRY_CODE,COUNTRY_NAME從一個國家ORDER BY IF(COUNTRY_CODE IN( 'CA' ,'美國'),0,1),country_name – 2012-08-04 13:51:18

4

要首先獲得被搜索到的國家,按字母順序餘:

SELECT * 
FROM stores 
ORDER BY country = 'us' DESC, country ASC