2011-01-23 15 views
1

IF ELSEステートメントがクエリ内でどのように機能するかは、ちょっと混乱します。ここでORDER BYのクエリ内のIFELSEステートメント

は、私がしようとし、それに加えてのバリエーションされてきたものだが、私はそれがエラーなしで結果を戻すために取得するように見えることはできません...

$get_trash = mysql_query("SELECT * 
          FROM message 
          WHERE message_to_user_id = '$user_id' 
          AND message_to_user_id_hide = 1 
           OR message_from_user_id = '$user_id' 
          AND message_from_user_id_hide = 1 
          IF message_to_user_id = '$user_id' 
          THEN ORDER BY message_to_user_id_hide_time DESC 
          ELSEIF 
           message_from_user_id = '$user_id' 
          THEN ORDER BY message_from_user_id_hide_time DESC 
          ENDIF") or die(mysql_error()); 

今私は、if else文を使用しました何度もPHPを使っていますが、mysqlクエリの中でこれを使ったことはありませんでした。

+0

私が注文したの突起のようなものがそのように行うことができるとは思わない:しかし、あなたが試したSQLに基づいて、私はあなたが探しているものは、これらの線に沿って何かだと思います。あなたはPHPでクエリを構築したり、ストアドプロシージャ内でこのジョブを実行する方が良いです – Perpetualcoder

+0

WHERE句に問題があります - (from、to)が正しくないため正しい結果を返さないオプティマイザには明らかです。あなたはそれらの周りに角括弧が必要です。第2に、fromフィールドとtoフィールドの両方が結果セットに含まれます。両方のカラムで同時に注文することはできません。この問合せは、UNION文として使用する方がよいでしょう。 –

+0

@OMG - MySQLとSQL Serverと私はほとんどすべてのDBMSがORの前に置かれていると思うので、非常に明白です。http://dev.mysql.com/doc/refman/5.0/en/operator-precedence.html – RichardTheKiwi

答えて

2

これは必要なのですか?

ORDER BY CASE '$user_id' WHEN message_to_user_id 
         THEN message_to_user_id_hide_time 
         WHEN message_from_user_id 
         THEN message_from_user_id_hide_time END DESC 
4

テーブルがどのように表示されるかはわかります。

SELECT * FROM message WHERE 
    (message_to_user_id = '$user_id' AND message_to_user_id_hide = 1) OR 
    (message_from_user_id = '$user_id' AND message_from_user_id_hide = 1) 
ORDER BY 
    (CASE 
     WHEN message_to_user_id = '$user_id' 
     THEN message_to_user_id_hide_time 
     ELSE message_from_user_id_hide_time 
    END) DESC 
+0

+1私は残りのクエリを見ていませんでしたが、これは(またはOMGのUNION)おそらく必要なものです。 –

+0

ORDER BYの括弧は必要ありません。オプティマイザに対するCASE文のタイミングを考えることはできませんが、読みやすくするために役立ちます。 –

+1

ORDER BYの括弧は分かりやすくするためのものですが、WHERE句の中の括弧はそこにあります。なぜなら、どのデータベースがORの前に、そして左から右にバインドされているか決して覚えていないからです。 –