sql >> データベース >  >> RDS >> Mysql

複数の基準に一致して順序付けするためのSQL手法はありますか?

    正しく理解できれば、ORDER BYで式を使用できるようです。 、次のStack Overflow投稿に与えられた受け入れられた回答と同様の方法で:

    したがって、クエリは次のようになります。

    SELECT    imageID
    FROM      ...
    JOIN      ...
    WHERE     designID = 100          
    ORDER BY  garmentID = 1 DESC,
              colorID = 5 DESC,
              sizeID = 10 DESC;
    

    garmentIDに注意してください 、colorID 、およびsizeID WHEREではフィルターとして使用されません 句。値はORDER BYでのみ使用されます 式。

    テストケース:

    CREATE TABLE designs (designID int, garmentID int, colorID int, sizeID int);
    
    INSERT INTO designs VALUES (100, 1, 1, 1);
    INSERT INTO designs VALUES (100, 1, 2, 2);
    INSERT INTO designs VALUES (100, 1, 5, 3);
    INSERT INTO designs VALUES (100, 1, 5, 10);
    INSERT INTO designs VALUES (100, 1, 5, 15);
    INSERT INTO designs VALUES (100, 1, 8, 20);
    INSERT INTO designs VALUES (100, 2, 5, 10);
    INSERT INTO designs VALUES (100, 2, 6, 15);
    INSERT INTO designs VALUES (101, 1, 1, 1);
    INSERT INTO designs VALUES (101, 2, 1, 1);
    

    結果:

    SELECT    * 
    FROM      designs 
    WHERE     designID = 100 
    ORDER BY  garmentID = 1 DESC, 
              colorID = 5 DESC, 
              sizeID = 10 DESC;
    
    +----------+-----------+---------+--------+
    | designID | garmentID | colorID | sizeID |
    +----------+-----------+---------+--------+
    |      100 |         1 |       5 |     10 |
    |      100 |         1 |       5 |      3 |
    |      100 |         1 |       5 |     15 |
    |      100 |         1 |       1 |      1 |
    |      100 |         1 |       2 |      2 |
    |      100 |         1 |       8 |     20 |
    |      100 |         2 |       5 |     10 |
    |      100 |         2 |       6 |     15 |
    +----------+-----------+---------+--------+
    8 rows in set (0.02 sec)
    

    指定されたgarmentIDに一致する行がどのように一致するかに注意してください 、colorID およびsizeID 最初です。それができない場合、garmentIDに一致する行 およびcolorID 次です。次に、garmentIDにのみ一致する行 従う。次に、designIDにのみ一致する残りの部分 WHEREのフィルター 条項。

    SQLでこれを行う価値があると思います。 @Tobyは他の回答に記載されています 、一般に、designIDで常にフィルタリングすることを前提として、このような少数の行を並べ替えるときにパフォーマンスを心配する必要はありません。 ...他の質問については、そのようなクエリの名前があるかどうかはわかりません。私はそれを「式による順序付け」と呼ぶ傾向があります。



    1. MySQLで日付を使用して月を取得する方法

    2. PythonとDjangoOperationalError(2006、「MySQLサーバーがなくなりました」)

    3. ユーザー入力、dbに送信する前にクリーンアップおよびサニタイズします

    4. SQLite Listview onclickは、dbをフィルターして開き、新しいアクティビティを生成します