如何使用特定值的订单

时间:2012-11-22 09:02:00

标签: mysql sql

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 

6 个答案:

答案 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)

enter image description here

为什么会这样。

显示MySQL数据库错误:非法混合排序(latin1_general_ci,IMPLICIT)和(latin1_swedish_ci,IMPLICIT)进行操作'='