2016-03-30 6 views
0

タイプを保ちますVARCHAR/DATETIMEフィールドがあるとすぐに、列自体の型を保持するのではなく、その型を返すようになります。選択されたレコードの種類を保持する方法があるかどうかは疑問でした。MySQLは、私はいくつかの入力に基づいて変化するフィールドを持つcase文

編集:キャストフィールドをintとしてCAST(id as INT)が動作しませんでした ケースステートメントを順序通りに並べることはうまくいかなかった。

+0

あなたはそのクエリが機能すると言うでしょうか?しかし、別のデータ型を返す?あなたは通常、異なるデータ型を持つ 'CASE'を持っていないからです。しかし、これはMySQLですので、奇妙なことを驚かせることはありません。 –

+0

クエリ自体は機能しますが、正しくは順序付けされません。そして、はい、mysqlは奇妙なことをします。 – RMT

+0

sqlFiddleで作業サンプルを準備できますか? –

答えて

0

これ以上の研究とテストの結果、私はそれをやり直す方法を見つけることができました。

SELECT id, created_at, scomment 
FROM test 
ORDER BY 
    CASE 1 WHEN 1 THEN id END ASC, 
    CASE 1 WHEN 2 THEN created_at END ASC, 
    CASE 1 WHEN 3 THEN scomment END ASC; 

これにより、特定のフィールドを正しく並べ替えることができます。 あなたも、次の操作を行って、異なる方向を追加することができます。

p_order_byは、ソートしたい番号フィールドがあり、そしてp_dirは方向である
SELECT id, created_at, scomment 
FROM test 
ORDER BY 
    CASE p_order_by WHEN 1 THEN AND p_dir = 'asc' id END ASC, 
    CASE p_order_by WHEN 1 THEN AND p_dir = 'desc' id END DESC, 
    CASE p_order_by WHEN 2 THEN AND p_dir = 'asc' created_at END ASC, 
    CASE p_order_by WHEN 2 THEN AND p_dir = 'desc' created_at END DESC, 
    CASE p_order_by WHEN 3 THEN AND p_dir = 'asc' scomment END ASC, 
    CASE p_order_by WHEN 3 THEN AND p_dir = 'desc' scomment END DESC; 

0

私はこのソリューションでは、かなりではないと思うが動作するはずです。

SQL Fiddle Demo

その上に順序であなたの各フィールドの新しい列を作成します。

SELECT CASE 1 
      WHEN 1 THEN id 
      WHEN 2 THEN created_at 
      WHEN 3 THEN scomment 
     END as field_name 
FROM (  
     SELECT I.id, I.rid, 
      C.created_at, C.rcreated_at, 
      S.scomment, S.rscomment  
     FROM (
      SELECT t.id, 
        @rowid := @rowid + 1 AS rid 
      FROM test t, 
        (SELECT @rowid := 0) r 
      ORDER BY t.id  
      ) I -- add sort column for id 
     JOIN (  
      SELECT t.id, created_at, 
        @rowcreated_at := @rowcreated_at + 1 AS rcreated_at 
      FROM test t, 
        (SELECT @rowcreated_at := 0) r 
      ORDER BY t.created_at  
      ) C -- add sort column for created_at 
     ON I.id = C.id 
     JOIN ( 
      SELECT t.id, scomment, 
        @rowscomment := @rowscomment + 1 AS rscomment 
      FROM test t, 
        (SELECT @rowscomment := 0) r 
      ORDER BY t.scomment 
      ) S -- add sort column for scomment 
     ON I.id = S.id 
    ) T 
ORDER BY CASE 1 
      WHEN 1 THEN rid 
      WHEN 2 THEN rcreated_at 
      WHEN 3 THEN rscomment 
     END 
+0

私はフィドル –

関連する問題