2011-04-26 47 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