6
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 
4

6 に答える 6

4

自国内での相対的な順序に基づいて、各場所にランクを付ける必要があります。変数を使用して、MySQL でその場しのぎの行番号関数を作成できます。

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;

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 フィドル

于 2012-11-22T09:10:35.290 に答える
1

このクエリは、oracle分析関数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;
于 2012-11-25T15:59:48.397 に答える
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たとえば、最初に挿入された場合でも、シドニーがメルボルンの前に来ることを示す方法はありません。

于 2012-11-26T19:46:23.377 に答える
0

ここに画像の説明を入力

なぜこれが起こるのか。

その表示MySQLデータベースエラー:操作「=」の照合(latin1_general_ci、IMPLICIT)と(latin1_swedish_ci、IMPLICIT)の不正な組み合わせ

于 2012-11-26T04:33:44.723 に答える
0
場所、国を選択
  FROM (国、場所、
                  @r:= CASE WHEN Country = @c THEN @r + 1 ELSE 1 END AS RN,
                  @c:= 国 AS C2
            からの国、
                  (SELECT @r:= 1) r,
                  (SELECT @c:= '') c
        )c
 ORDER BY rn、国 DESC;

サブクエリに Order by があってはなりません

于 2012-11-25T17:56:11.913 に答える