2016-07-13 11 views
0

私はmysqlリクエストで特別な動作をしようとしています。ここで参加から最初の行だけを取得する

は私のテーブルです:

users 
id, email 

infos_users 
id_user, firstName, lastName, avatar 

chatroom 
id 

chatroomUsers 
id_chatroom, id_user 

chatMessage 
id, id_chatroom, message, id_sender 

私がやりたい事は、ユーザがしているすべてのチャットルームを取得するには、ユーザーIDに基づいて、そのユーザーとのすべての部屋を取得することでこれを行うために、私は。 「この要求を使用してメートル:?は私がに焦点を当てていたユーザーのIDです

SELECT  chatroomUsers.id_chatroom, 
      users.id, 
      infos_user.avatar, 
      infos_user.firstName, 
      infos_user.lastName 
FROM  chatroomUsers 
INNER JOIN users  ON chatroomUsers.id_user = users.id 
INNER JOIN infos_user ON infos_user.id_user = users.id 
WHERE  id_chatroom IN 
(
    SELECT id_chatroom 
    FROM chatroomUsers 
    WHERE id_user = ? 
) 

。もちろん、私はすべてをきれいにし、key = id_chatroomで素敵な配列を持ち、ユーザーの配列を評価するためにいくつかの後処理をしています。

次は何ですか?まあ、すべての行、チャットルームの最後のメッセージ(対応するid_chatroomと最高のid_message値を持つもの)が必要です。いくつかの後処理を行うために、もう一度

id_chatroom  id avatar  firstName lastName lastMessage   id_message id_sender 
0    0 avatar1  blah1  blah2  blahblahblah  0   1 
0    1 avatar2  blah3  blah4  blahblahblah  0   1 
1    2 avatar3  blah5  blah6  blahblahblahblah 1   3 
1    1 avatar1  blah1  blah2  blahblahblahblah 1   3 
1    3 avatar4  blah7  blah8  blahblahblahblah 1   3 

id_chatroom  id avatar  firstName lastName 
0    0 avatar1  blah1  blah2 
0    1 avatar2  blah3  blah4 
1    2 avatar3  blah5  blah6 
1    1 avatar1  blah1  blah2 
1    3 avatar4  blah7  blah8 

、私はこのような何かをしたい:現在の要求は私にこれを返します。しかし、私がリクエストを作成しようとするたびに、それはすべてを駄目にします。

誰かが私を助けることができますか?

編集:チャットルームのメッセージは録音できませんでした。その場合は、メッセージフィールドにnullと入力します。

+0

あなたは何をあなたに説明することができますクウェリーが返すべきことをあなたが尋ねたことを理解できなかったのですか? – Cherif

+0

@Charifそれは不明ですか?すべてが投稿にあります! – Devz

+0

私はこれを理解していませんでした 最終的にsender_id – Cherif

答えて

0

1つのチャットルームの最後のメッセージを表示するには、サブクエリを使用する必要があります。あなたはnull値とのチャットルームあたり何のメッセージを持っていないメッセージの列を埋めるためにしたい場合は、left joinを使用する必要がありますので、我々は(多分非常にシンプル1)このようにそれを行うことができます。

SELECT  chatroomUsers.id_chatroom, 
      users.id, 
      infos_user.avatar, 
      infos_user.firstName, 
      infos_user.lastName, 
      sub.message AS lastMessage, 
      sub.id AS id_message, 
      sub.id_sender 
FROM  chatroomUsers 
INNER JOIN users  ON chatroomUsers.id_user = users.id 
INNER JOIN infos_user ON infos_user.id_user = users.id 
LEFT JOIN (
    SELECT t1.* 
    FROM chatMessage t1 
    INNER JOIN (
     SELECT MAX(id) AS id, id_chatroom 
     FROM chatMessage 
     GROUP BY id_chatroom 
    ) t2 ON t1.id_chatroom = t2.id_chatroom AND t1.id = t2.id 
) sub     ON chatroomUsers.id_chatroom = sub.id_chatroom 
WHERE  id_chatroom IN 
(
    SELECT id_chatroom 
    FROM chatroomUsers 
    WHERE id_user = ? 
) 
+0

完璧に動作します!ありがとう! – Devz

-1

SELECT TOP句を使用します。ここで

ので

SELECT TOP 1 chatroomUsers.id_chatroom, 
     users.id, 
     infos_user.avatar, 
     infos_user.firstName, 
     infos_user.lastName 
+0

私の問題は解決しません...:o – Devz

0
SELECT 
    cru.id_chatroom, 
    u.id, 
    iu.avatar, 
    iu.firstName, 
    iu.lastName, 
    cm.message AS lastMessage, 
    xx.max_id AS id_message, 
    cm.id_sender 
FROM chatroomUsers cru 
JOIN users u ON cru.id_user = u.id 
JOIN infos_user iu ON iu.id_user = u.id 
LEFT JOIN (
    SELECT 
     MAX(cmx.id) AS max_id, 
     cmx.id_chatroom 
    FROM chatroomUsers cmx 
    GROUP BY id_chatroom 
) xx ON xx.id_chatroom = cru.id_chatroom 
LEFT JOIN chatroomUsers cm ON (cm.id = xx.id) 
WHERE  id_chatroom IN 
(chatroomUsers 
    SELECT id_chatroom 
    FROM chatroomUsers 
    WHERE id_user = ? 
); 

、あなたはすべてのチャットルームのための最後のID(MAX(id))を持つ副選択に参加しています。次に、あなたは再びそのメッセージの内容を得るために参加しています。

データモデルが不明なので、左ジョインを使用しました。私はと思う。ユーザーは部屋にいる可能性がありますが、部屋は全く新しいものではなく、まだ何も言われていません。左の結合は、その場合に残りのユーザー情報を表示できるようにします。


注意:私はこれをテストするのに便利なMySQLを持っていません。

+0

さて、私はそれを試して、それは私が修正しなければならなかったエラーがいっぱいでした。しかし、まだ動作しません...部屋は新しいことができません。少なくとも2人のユーザーがいなければなりません。最初の投稿で言わなかったこともありますが、メッセージが入っていない可能性があります。その場合は、メッセージに関連するすべてのフィールドがnull 。 – Devz

+0

ああ、私はid_senderでグループを出て、それを取り出すべきです。私は編集しますが、すでに答えはありますが、基本的に同じです。 – SQB

0

私はこのために何らかの種類のdatestamp列を使用したいと思いますが、あなたは自動インクリメントIDでそれを行うことができます。

(SELECT id_chatroom, message FROM chatMessage INNER JOIN (SELECT id_chatroom, max(id) AS most_recent_id FROM chatMessage GROUP BY id_chatroom) mostRecents ON chatMessage.id = mostRecents.most_recent_id) 

作成したテーブルをジョインにスローすると、そのテーブルが機能するはずです。この種のものはいつも大事な感じですが、ORDERとの場合は GROUPの方が良い方法は見つけられませんでした。

+0

私はある種のdatestampを持っていますが、mysql(後処理のためにのみ)では使用できません。私はこれが最高のIDだけでやることができると思う。 – Devz

関連する問題