制作邮件系统并处理收件箱页面。
收件箱页面以“线程”方式组织,我想展示两方之间的最新通信。想一想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查询中?
感谢任何帮助。
谢谢。
答案 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)
可能有其他方式来表达这一点,但这是一个开始。