我有一个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
使用并告知在顶部放置一定值吗?
答案 0 :(得分:15)
试试这个:
SELECT * FROM stores ORDER BY country = "us" DESC, storeId
答案 1 :(得分:4)
首先获取搜索到的国家/地区,其余按字母顺序排列:
SELECT *
FROM stores
ORDER BY country = 'us' DESC, country ASC
答案 2 :(得分:2)
您必须使用数字链接国家/地区的每个值,并使用大小写:
select *
from stores
order by case when country = "us" then 1
else 0
end desc
答案 3 :(得分: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;
答案 4 :(得分: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
的伪列。
在这里你可以将“US”映射到“aaaUS”。
JP
仍可以映射到JP
。
这使得美国成为排序榜首。