1

「Abstain」、「Block」、「No」、「Yes」のいずれかの文字列変数をデータベースに保存しました。現在、これらを使用して取得していますORDER BY positionが、アルファベット順ではなく、「ブロック」、「いいえ」、「棄権」、「はい」のように並べたいと思います。Railsでこれを行う簡単な方法はありますか?

これに対する私の正確なコードは次のとおりです。

def self.unique_votes(motion)
  Vote.find_by_sql("SELECT * FROM votes a WHERE created_at = (SELECT MAX(created_at) as created_at FROM votes b WHERE a.user_id = b.user_id AND motion_id = #{motion.id}) ORDER BY a.position")
end

NB: 私は Postgres SQL を使用しており、select ステートメントで使用できるソリューションを探しています ありがとう!

4

4 に答える 4

7

これはそのための方法の 1 つです。ちなみに、このようなことを行う最善の方法は、テーブルの主キーを参照するため"Position"に、テーブル内のすべての値と外部キーによってすべての値を識別するという名前の別のテーブルを用意することです。また、それらの数値を格納して並べ替えるために、テーブルに名前を付けた別の列を作成することもできます。これらのことは、すべての選択ではなく、挿入時に行う必要があります。"votes""Position""Order""Position"

乾杯

SELECT  *
,   Case    a.position
        When    'Block'     Then    0
        When    'No'        Then    1
        When    'Abstain'   Then    2
        When    'Yes'       Then    3
        Else    -1
    End                     As  Position_Value
    FROM    votes   a
    WHERE   created_at =    (
        SELECT  MAX(created_at) as  created_at
            FROM    votes   b
            WHERE   a.user_id   =   b.user_id
            AND motion_id   =   #{motion.id}
    )
    ORDER   BY  Position_Value

うまくいかない場合はどうにかしてください!あなたはこれを試すことができます:

Select  *
    From    (
        SELECT  *
    ,   Case    a.position
            When    'Block'     Then    0
            When    'No'        Then    1
            When    'Abstain'   Then    2
            When    'Yes'       Then    3
            Else    -1
        End                     As  Position_Value
        FROM    votes   a
        WHERE   created_at =    (
            SELECT  MAX(created_at) as  created_at
                FROM    votes   b
                WHERE   a.user_id   =   b.user_id
                AND motion_id   =   #{motion.id}
        )
    )   As  Result
    ORDER   BY  Position_Value
于 2012-09-11T04:52:39.200 に答える
4

不自然な順序でソートする必要があるシリーズがあるときはいつでも、追加の整数フィールドを追加し、文字列値を任意の順序に強制する値をそこに入れます。

だけではなく:

'Abstain'
'Block'
'No'
'Yes'

私は2番目のフィールドを持っています:

'Abstain' 3
'Block'   1
'No'      2
'Yes'     4

2 番目の列で並べ替えると、目的の順序で値を取得できます。

'Block'   1
'No'      2
'Abstain' 3
'Yes'     4
于 2012-09-11T04:53:51.883 に答える
2

これが永続的な要件である場合は、それらを別のテーブルに保存し、別の列「順序付け」を使用して、目的の順序で印刷するための番号を保持し、結果をこのテーブルと結合し、順序付け列で ORDER BY できます。

これが一時的なものである場合は、結果をUNION一連の SQL ステートメントと結合して、値と順序を選択し、順序付け列で並べ替えることができます。

于 2012-09-11T04:51:39.687 に答える
0

MySQL のFIELD関数のようなもの、つまり配列へのインデックス ルックアップを定義して、それをORDER BY. 配列よりも少し簡潔です。

参照: https://stackoverflow.com/a/12366184/398670

于 2012-09-11T09:10:46.850 に答える