0

制作一个消息系统并在收件箱页面上工作。

收件箱页面以类似“线程”的方式组织,我想展示两方之间的最新通信。想想 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查询中转储值?

任何帮助表示赞赏。

谢谢你。

4

1 回答 1

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 变量。没有关于何时相对于查询中的其他表达式评估 this 的规则。我会做出一个有根据的猜测,SELECT子句中的表达式总是在 join 和 group bys 之后进行评估。在这种情况下,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)

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

于 2013-02-07T20:46:38.003 回答