2009-07-03 26 views
9

Tôi có một bảng MySQL với các dữ liệu sau (giản thể):Phân loại giá trị nhất định để đầu

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'); 

Bây giờ, tôi muốn có thể để có được một danh sách đánh số của các cửa hàng bắt đầu với nước khách hàng.

Ví dụ, một khách hàng người Mỹ sẽ thấy danh sách sau đây:

Foo 
Baz 
Bar 
Foo2 
Baz2 
Bar3 

Giải pháp ngây thơ Tôi đang sử dụng ngay bây giờ (ví dụ với một khách hàng và trang mỹ kích thước 3):

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

Có cách nào tốt hơn để thực hiện việc này không? Có thể ORDER BY được sử dụng và nói để đặt một giá trị nhất định ở đầu trang?

Trả lời

15

Hãy thử điều này:

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

Ahh, đây chính xác là những gì tôi đang tìm kiếm, cảm ơn – truppo

1

Bạn cần phải liên kết với mỗi giá trị của một quốc gia với một số, với một trường hợp:

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

Tạo một bảng mã quốc gia và đơn đặt hàng, tham gia vào nó trong truy vấn của bạn, và sau đó theo thứ tự của đất nước thứ tự mã.

Vì vậy, bạn sẽ có một bảng trông giống như

CountryOrder 

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

và sau đó mã mà trông giống như:

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

Làm thế nào về việc sử dụng IF để gán giá trị trên xuống hàng Mỹ.

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

Điều này sẽ cung cấp cho bạn một cột giả gọi là sort_country_cd. Ở đây bạn có thể ánh xạ "US" thành "aaaUS". JP vẫn có thể được ánh xạ tới JP.

Điều đó đặt Hoa Kỳ lên đầu danh sách sắp xếp của bạn.

+0

CHỌN mã quốc gia, COUNTRY_NAME TỪ TRÌNH TỰ nước THEO NẾU (COUNTRY_CODE IN ('CA' , 'US'), 0,1), country_name –

4

Để có được đất nước đã tìm kiếm-cho lần đầu tiên, và phần còn lại theo thứ tự abc:

SELECT * 
FROM stores 
ORDER BY country = 'us' DESC, country ASC 
Các vấn đề liên quan