0

これにぴったりのタイトルを見つけるのに苦労しています。

私は 2 つのテーブルを持つメッセージング システムに取り組んでいます。1 つはすべての異なる会話 (会話中のユーザーと会話の uid) を持ち、もう 1 つはユーザー間のメッセージを含みます。

会話ごとに、会話の uid と user_id を使用して、会話内のすべてのユーザーの行を作成しています。会話には 2 人のユーザーだけでなく、それ以上 (3、4、5、6 など) のユーザーがいる場合もあります。

解決方法がわからない SQL ステートメントに問題があります。問題は、3 人のユーザーの間で会話があり、その後、2 人のユーザーが 3 人目のユーザーなしでプライベートに会話を始めたいと言う場合です。2 人のユーザーが既に他のユーザーと会話しているときに、SQL ステートメントが何も返さないようにするにはどうすればよいですか。テーブルに 2 つの新しい行を独自のプライベート conversation_id で追加できるようにします。

テーブルは次のようになりconversation_listます。

|id | user_id| conversation_id|
 -----------------------------
| 1 |       1|               1|
| 2 |       3|               1|
| 3 |       1|               2|
| 4 |       2|               2|
| 5 |       4|               2|

そして今のところ、私のSQLコードは次のようになっています:

SELECT *
FROM conversation_list
WHERE user_id IN (user1_id,user_id2)
GROUP BY conversation_id
HAVING COUNT(*) = 2 
4

2 に答える 2

2

あなたの質問のこの言い直しは正しいですか:

「2人のユーザーのいずれかが他のユーザーと会話しているときに、SQLステートメントが何も返さないようにするにはどうすればよいですか?」

...また

「これらのユーザーが他のユーザーと会話していない場合にのみ、SQL ステートメントが行を返すようにするにはどうすればよいですか?」

SELECT conversation_id
FROM conversation_list
WHERE user_id IN (5,6)
AND conversation_id NOT IN (
    SELECT conversation_id from conversation_list where user_id NOT IN (5,6)
)
GROUP BY conversation_id
HAVING COUNT(*) = :nb_users 

これは、これらのユーザーが他のユーザーと会話していない場合にのみ行を返します。

于 2012-06-07T20:14:38.633 に答える
1

私があなたの問題を正しく理解したかどうか見てみましょう:あなたはその会話に参加してconversation_idいるすべてのをリストした場合にのみ戻りたいですか?user_id

その場合は、この質問に対する私の答えを見てください。会話は参加者の名前付きセットと考えることができるため、conversation_idはセットの名前であり、user_idsはそのセットのアイテムです。答えには、説明が含まれている3つの異なる方法があります。

テーブルに適合した最後のバージョンは、おおよそ次のようになります。

SELECT totals.conversation_id
FROM (
    SELECT conversation_id, COUNT(*) count
    FROM conversation_list
    GROUP BY conversation_id
) totals
INNER JOIN (
    SELECT conversation_id, COUNT(*) count
    FROM conversation_list
    WHERE user_id IN (6, 5)
    GROUP BY conversation_id
) matches
ON (totals.conversation_id = matches.conversation_id)
WHERE totals.count = 2 AND matches.count = 2;

ここで、6と5はuser_idsで、2はuser_idsの数です。

最初のサブクエリは各会話のユーザーの総数を検索し、2番目のサブクエリは各会話の一致するユーザーの数を検索します。が2の場合matches.count、会話には探しているすべてのユーザーが含まれ、totals.countも2の場合、会話には追加のユーザーは含まれません。

于 2012-06-07T20:51:27.713 に答える