4

次の表があるとします

name        | genre
---------------------
book 1      | scifi
book 2      | horror
book 3      | scifi
book 4      | romance
book 5      | horror

上記の表を「ジャンル」で並べ替えるとSQL、次の結果が得られます。注文に注意してください。これはHSRであり、HR Sではありません。使用せずにこれを実現することは可能UNIONですか?

name        | genre
------------------------
book 2      | horror
book 5      | horror
book 1      | scifi
book 3      | scifi
book 4      | romance

編集: 3つのジャンルしかありません。

4

5 に答える 5

7

フィールド関数を使用して、並べ替え順序をカスタマイズできます

SELECT * FROM `table` ORDER BY FIELD(`genre`, 'horror', 'scifi', 'horror'), `name`;
于 2012-06-05T01:16:06.243 に答える
2

試す: select * from table order by case when genre="romance" then 1 else 0 end, genre;

于 2012-06-05T01:15:34.727 に答える
2

上記のENUM回答の代わりに、次のようなものを含むジャンル注文テーブルを追加します。

genre_name | sort_order
-----------------------
scifi      | 2
horror     | 1
romance    | 3

次に、クエリを次のように実行します。

SELECT name, genre
FROM books JOIN genres ON books.genre = genres.genre_name
ORDER BY genres.sort_order, books.name;

これには、コード内のハードコードされたENUMを変更せずに、すばやく簡単にジャンルを追加できるという追加の利点があります。ただし、どちらの方法でも機能するはずです。

于 2012-06-05T01:17:24.743 に答える
0
  1. ENUMジャンル列をタイプとして定義できます。マニュアルに記載されているように:

    ENUM値は、列挙型メンバーが列仕様にリストされている順序に依存するインデックス番号に基づいてソートされます。たとえば、'b'前にを並べ替え'a'ますENUM('b', 'a')。空の文字列は空でない文字列の前にソートされ、NULL値は他のすべての列挙値の前にソートされます。

    したがって:

    ALTER TABLE my_table MODIFY genre ENUM('horror', 'scifi', 'romance');
    

    その場合、クエリは次のようになります。

    SELECT * FROM my_table ORDER BY genre ASC;
    
  2. または、ジャンルのテーブルを順序付けの位置とともに保存し、クエリを次のように結合することもできます。

    CREATE TABLE genres (genre VARCHAR(10) NOT NULL PRIMARY KEY, position INT);
    INSERT INTO genres VALUES ('horror', 1), ('scifi', 2), ('romance', 3);
    ALTER TABLE my_table ADD FOREIGN KEY (genre) REFERENCES genres (genre);
    

    その場合、クエリは次のようになります。

    SELECT   my_table.*
    FROM     my_table JOIN genres USING (genre)
    ORDER BY genres.position ASC;
    
于 2012-06-05T01:14:41.000 に答える
0

まず、テーブルは非常に非効率的です(データが冗長です)。したがって、すべてのジャンルを含む新しいテーブルを作成し、外部キーを使用するだけです。

次に、ジャンルテーブルに列を追加し、並べ替えの目的の位置に応じて、各ジャンルに一意の番号を割り当てます。次に、データをその列で並べ替えるだけで完了します(並べ替え順序は簡単に変更できます)。いつでも)。

于 2012-06-05T01:18:11.813 に答える