0

メッセージングシステムを作成し、受信トレイページで作業します。

受信トレイページは「スレッド」のように構成されており、2者間の最新のコミュニケーションを示したいと思います。あなたがメッセージを送信したか相手が送信したかにかかわらず、送信された最新のメッセージが表示される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  |
----------------------------------------------

columnの値が変数に割り当てられていないと思う傾向がありますが、このクエリをデバッグして@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変数に値を割り当てることだと思います。これがクエリ内の他の式と比較していつ評価されるかについての規則はありません。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)

これを表現する方法はおそらく他にもありますが、これは始まりです。

于 2013-02-07T20:46:38.003 に答える