MySQL:将列值赋给变量

时间:2013-02-07 20:08:22

标签: mysql

制作邮件系统并处理收件箱页面。

收件箱页面以“线程”方式组织,我想展示两方之间的最新通信。想一想facebook收件箱(左侧部分),它显示发送的最新消息,无论您是发送了消息还是另一方发送了消息。

这是我目前的查询:

SELECT 
    m.*, 
    s.*, 
    c.*, 
    u.*,
    CASE    
     WHEN m.uid_recipient <> 292 THEN @user_id := m.uid_recipient
     WHEN m.uid_sender <> 292 THEN @user_id := m.uid_sender
    END 
FROM messages m
JOIN signup s ON s.uid = @user_id
LEFT JOIN companies c ON c.uid = s.uid
LEFT JOIN users u ON u.uid = s.uid
WHERE COALESCE(u.uid, c.uid) IS NOT NULL
    AND (m.uid_recipient = 292 AND deleted_recipient = '0')
    OR (m.uid_sender = 292 AND deleted_sender = '0')
ORDER BY datetime DESC

此查询运行但返回一个空结果集,它应返回3个结果。

邮件位于包含发件人ID和收件人ID的表中。现在我要做的是将对方的信息加入到行中。所以我的case语句判断收件人id是否是当前用户的id,如果不是,则应该将@user_id变量设置为对方的id,这样就可以用它将对方的信息加入该行。

消息表看起来如此(相关列):

----------------------------------------------
|uid_sender    |uid_recipient    |message    |
----------------------------------------------
|292           |1040             |Test 3     |
----------------------------------------------
|1040          |292              |Test reply |
----------------------------------------------
|292           |1040             |First msg  |
----------------------------------------------

我倾向于认为列的值未分配给变量,但我不知道如何调试此查询以返回分配给@user_id的值。无论如何都要将值转储到mysql查询中?

感谢任何帮助。

谢谢。

1 个答案:

答案 0 :(得分:2)

这个表达式:

CASE    
 WHEN m.uid_recipient <> 292 THEN @user_id := m.uid_recipient
 WHEN m.uid_sender <> 292 THEN @user_id := m.uid_sender
END 
我相信

是为@user_id变量赋值。关于何时相对于查询中的其他表达式进行评估,没有规则。我会做出有根据的猜测,SELECT子句中的表达式总是在连接和分组后评估。在这种情况下,from子句中使用的值始终是初始值。

我认为您应该将其移至from子句:

FROM messages m join
     signup s
     ON s.uid = (CASE WHEN m.uid_recipient <> 292 THEN m.uid_recipient
                      WHEN m.uid_sender <> 292 THEN  m.uid_sender
                 END)

可能有其他方式来表达这一点,但这是一个开始。