2013-02-07 172 views
0

製作消息傳遞系統並在收件箱頁面上工作。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查詢中的值?

任何幫助表示讚賞。

謝謝。

+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 

是,我相信,assiging值給@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) 

可能有其他的方式來表達這一點,但是這是一個開始。

+0

工作!真棒! – ReX357