sql
  • mysql
  • sql-order-by
  • 2011-01-23 6 views 1 likes 
    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()); 
    

    내가 다른 문 경우 사용했습니다 봤는데 무엇 PHP로 무수히 많은 시간을 보냈지 만, MySQL 쿼리를 사용하지 않았기 때문에 누군가가 여러분이 어떻게 움직이는지를 밝힐 수 있다면 정말 고맙겠습니다!

    +0

    나는 이런 식으로 명령 된 프로젝션을 할 수 있다고 생각하지 않습니다. PHP로 질의를 작성하거나 저장된 프로 시저 내에서이 작업을 수행하는 것이 더 낫다. – Perpetualcoder

    +0

    WHERE 절에 문제가있다 - (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

    테이블 모양을 말할 수 있다면 도움이 될 것입니다. 그러나 당신이 시도한 SQL을 기반으로, 당신이 찾고있는 것이이 라인에있는 무엇인가라고 생각합니다 :

    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 이전에 바인드되었는지, 그리고 왼쪽에서 오른쪽으로 바인드 된 것을 기억할 수 없기 때문입니다. –

    관련 문제