CREATE TABLE Countries(location varchar(255), country varchar(255))
INSERT INTO Countries(location, country)
VALUES('Arkansas', 'US'),
('Newyork', 'US'),
('New Jersey', 'US'),
('Tokyo', 'JP'),
('Yokohama', 'JP'),
('Chennai', 'IN'),
('Delhi', 'IN'),
('Sydney', 'AU'),
('Melbourne', 'AU');
我需要查询以下输出
Location | Country
--------------------------------
Arkansas US
Tokyo JP
Chennai IN
Sydney AU
Newyork US
Yokohama JP
Delhi IN
Melbourne AU
New Jersey US
答案 0 :(得分:4)
您需要根据其所在国家/地区的相对顺序为每个位置指定排名。你可以使用变量在MySQL中创建一个临时的rownumber函数:
SELECT Country,
Location,
@r:= CASE WHEN Country = @c THEN @r + 1 ELSE 1 END AS RN,
@c:= Country AS C2
FROM Countries,
(SELECT @r:= 1) r,
(SELECT @c:= '') c
ORDER BY Country, Location;
这将输出
COUNTRY LOCATION RN C2
AU Melbourne 1 AU
AU Sydney 2 AU
IN Chennai 1 IN
IN Delhi 2 IN
JP Tokyo 1 JP
JP Yokohama 2 JP
US Arkansas 1 US
US New Jersey 2 US
US Newyork 3 US
然后您可以通过RN和国家/地区订购此产品以获得您想要的订单
SELECT Location, Country
FROM ( SELECT Country,
Location,
@r:= CASE WHEN Country = @c THEN @r + 1 ELSE 1 END AS RN,
@c:= Country AS C2
FROM Countries,
(SELECT @r:= 1) r,
(SELECT @c:= '') c
ORDER BY Country, Location
) c
ORDER BY rn, Country DESC;
<强> Example on SQL Fiddle 强>
修改强>
由于您收到排序规则错误,但未指定排序规则错误的唯一方法,我希望纠正这一点是对所有内容使用显式排序规则:
SELECT Location, Country
FROM ( SELECT Country COLLATE utf8_general_ci AS Country,
Location COLLATE utf8_general_ci AS Location,
@r:= CASE WHEN Country = @c THEN @r + 1 ELSE 1 END AS RN,
@c:= Country COLLATE utf8_general_ci AS C2
FROM Countries,
(SELECT @r:= 1) r,
(SELECT @c:= '' COLLATE utf8_general_ci) c
ORDER BY Country, Location
) c
ORDER BY rn, Country DESC
<强> SQL FIDDLE 强>
答案 1 :(得分:1)
试试这个:
在mysql中使用按字段()排序
select Location, Country
from Countries
order by Field(Location,'Arkansas','Tokyo','Chennai',...)
答案 2 :(得分:1)
您可以使用oracle Analytical function rank()
执行此查询这是同一个
的工作查询select tbl.l,
tbl.c
from
(
select location l,
country c,
rank() over (partition by country order by rowid) rnk
from countries
order by rowid,rnk) tbl
order by rnk,rowid;
答案 3 :(得分:1)
如果没有id
,您无法按照自己的方式订购表格。你可以这样创建你的表:
CREATE TABLE Countries(
id INT NOT NULL AUTO_INCREMENT,
location varchar(255),
country varchar(255),
PRIMARY KEY(ID))
然后你可以插入你的数据:
INSERT INTO Countries(location, country)
VALUES('Arkansas', 'US'),
...
Ant然后我将使用标准SQL编写查询:
SELECT *
FROM Countries c1
ORDER BY (select count(*)
from countries c2
where c1.country=c2.country
and c1.id>c2.id), id
这个查询可能不会很快,但它会起作用。但是,如果不使用id
,则无法回答您的问题。 SQL表没有默认顺序,所以如果没有id
就没有办法告诉它,例如,悉尼来到墨尔本之前,即使它是先插入的。
答案 4 :(得分:0)
SELECT Location, Country FROM (SELECT Country,Location, @r:= CASE WHEN Country = @c THEN @r + 1 ELSE 1 END AS RN, @c:= Country AS C2 FROM Countries, (SELECT @r:= 1) r, (SELECT @c:= '') c )c ORDER BY rn, Country DESC;
子查询中应该没有Order by
答案 5 :(得分:0)
为什么会这样。
显示MySQL数据库错误:非法混合排序(latin1_general_ci,IMPLICIT)和(latin1_swedish_ci,IMPLICIT)进行操作'='