2011-04-26 50 views
0

我遇到問題了解如何爲下面複製的查詢創建一個case語句。本質上,查詢所做的只是從messages_messages查詢當前用戶發送的數據($ userid)或者發送原始線程($ threadid)的發件人。對於除線程的原始發件人之外的所有人來說,這是一個完美的SELECT,他們應該能夠將所有與該線程相關的消息都提取出來。幫助創建正確的CASE語句

基本上我需要添加SQL相當於以下語句:

WHERE messages_threads.id = $threadid 
    if($userid == messages_threads.senderid) { 
     // Don't add an AND clause 
    } else { 
     // Add the following AND clause 
     AND (messages_messages.senderid = $userid OR messages_messages.senderid = messages_threads.senderid) 
    } 

這裏是我目前使用的查詢:

SELECT messages_messages.id, messages_messages.senderid, username AS sendername, pictures.url AS picture, body, UNIX_TIMESTAMP(time) AS unixtimestamp 
     FROM messages_messages 
     JOIN messages_threads ON messages_threads.id = messages_messages.threadid 
     JOIN users ON messages_messages.senderid = users.id 
     LEFT JOIN pictures ON messages_messages.senderid = pictures.userid AND pictures.profile = 1 
     WHERE messages_threads.id = $threadid 
     AND (messages_messages.senderid = $userid OR messages_messages.senderid = messages_threads.senderid) 
     ORDER BY time ASC 

回答

1

任何系列的if語句可以被轉換成AND和OR:

WHERE messages_threads.id = $threadid AND 
    ($userid=messages_threads.senderid OR      
     (messages_messages.senderid = $userid OR 
     messages_messages.senderid = messages_threads.senderid)) 

如果$userid==messages_threads.senderid爲真,則整個or子句爲真,因此沒有其他檢查。如果它是錯誤的,則檢查該子句的其餘部分。

+0

非常感謝!唯一的問題是$ userid == messages_threads中的兩個等號 - 應該只是一個等號。 – Walker 2011-04-26 20:47:53

+0

@Walker:啊葉,編輯修復 – Claudiu 2011-04-26 20:49:33