2009-07-03 12 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

これを試してみてください(「CAの国のORDER FROM

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

ああ、これはまさに私が探していたものです、ありがとう – truppo

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 

、その後のようなコードのように見えるテーブルだろう:US行にトップ値を代入するIFの使用について

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

方法を。

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

これにより、sort_country_cdという疑似列が得られます。 ここでは、 "US"を "aaaUS"にマップできます。 JPはまだJPにマップできます。

これは、USをソートリストの一番上に置きます。

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

SELECT COUNTRY_CODE、COUNTRY_NAME IF(COUNTRY_CODE BY 、 'US')、0,1)、country_name –

4

が最初に検索-のための国を取得するには、アルファベット順残り:

関連する問題