2017-10-13 7 views
-1

未応答の会話が3つ未満のユーザーを他の条件で取得しようとしています。未応答の会話が3件未満のユーザーを表示

しかし、何らかの理由でそれは私のために働いていません。

"ユーザー" テーブル

| user_id | name | email | 
|---------|------|-------| 
| 1  |"xxx" |"xxx" | 
| 2  |"xxx" |"xxx" | 
| 3  |"xxx" |"xxx" | 
| 4  |"xxx" |"xxx" | 
| 5  |"xxx" |"xxx" | 
|---------|------|-------| 

"会話" テーブル

| id | user1| user2 | 
|---------|------|-------| 
| 1  | 3 | 2 | 
| 2  | 3 | 4 | 
| 3  | 5 | 2 | 
| 4  | 4 | 1 | 
| 5  | 1 | 2 | 
|---------|------|-------| 

"メッセージ" テーブル

| id | conversation | sender | recipient | text | 
|---------|--------------|--------|-----------|------| 
| 1  |  1  | 3 |  2  | *** | 
| 2  |  2  | 3 |  4  | *** | 
| 3  |  3  | 5 |  2  | *** | 
| 4  |  4  | 4 |  1  | *** | 
| 5  |  5  | 1 |  2  | *** | 
| 6  |  2  | 4 |  3  | *** | 
| 7  |  4  | 1 |  4  | *** | 
|---------|--------------|--------|-----------|------| 

は、ここで私はまた、すべての会話を見つけるためにあなたが持っているユーザー1,4ではなく、ユーザー2.

+0

_unanswered_を定義します。 – jarlh

+0

未回答の会話の意味:送信者が受信者に送信したが、受信者からの返信は得られないメッセージが1つしかない会話。 – DMH

+0

最初に、未回答の会話を返すサブクエリが必要です。それから、グループに参加してグループ化します。 – jarlh

答えて

1

ファーストを返す必要があり、これは、クエリの上

LEFT JOIN 
    (
     SELECT *,COUNT(id) as totalCoversations 
     FROM conversation cn 
      INNER JOIN(
        SELECT conversation,COUNT(ms.conversation) as totalMsg 
        from message ms 
        GROUP BY ms.conversation 
        HAVING totalMsg < 3 
      ) msg ON msg.conversation = cn.id 
     GROUP BY cn.id 
    ) convr ON convr.user2 = u.id 

に参加してみてください、私の現在のクエリ

SELECT DISTINCT u.id,u.name, u.email 
FROM users u 
INNER JOIN(
     SELECT *,COUNT(conversation) as totalConversations 
     from message 
     GROUP BY id 
     HAVING totalConversations IS NULL OR totalConversations < 3 
    ) msg ON (msg.sender = u.id) OR (msg.recipient = u.id) 

であります同じ受信者があることを意味します。つまり、回答がないことを意味します。

SELECT conversation, COUNT(DISTINCT recipient) numberOfRecipients, recipient 
    from message 
    GROUP BY conversation, recipient 
    HAVING numberOfRecipients = 1 

あなたは未回答のコンバージョン

SELECT COUNT(DISTINCT t.conversation) totalUnansweredConversations, m.recipient FROM (
    SELECT conversation, COUNT(DISTINCT recipient) numberOfRecipients 
    from message 
    GROUP BY conversation 
    HAVING numberOfRecipients = 1 
) t 
    JOIN message m ON m.conversation = t.conversation 
    GROUP BY m.recipient 
    HAVING totalUnansweredConversations < 3 

その後、あなただけのユーザーテーブルとその派生テーブルに参加して、あなたは会話を答えなかったユーザーを取得:受信者がersationsとグループは各ユーザーが未回答の会話を持っているどのくらいもらうようにします。完全なクエリ:

SELECT DISTINCT users.* 
FROM users 
JOIN (
    SELECT COUNT(DISTINCT t.conversation) totalUnansweredConversations, m.recipient FROM (
    SELECT conversation, COUNT(DISTINCT recipient) numberOfRecipients 
    from message 
    GROUP BY conversation 
    HAVING numberOfRecipients = 1 
) t 
    JOIN message m ON m.conversation = t.conversation 
    GROUP BY m.recipient 
    HAVING totalUnansweredConversations < 3 
) derived ON users.id = derived.recipient 
UNION 
SELECT DISTINCT u.* 
FROM users u 
LEFT JOIN conversation c ON u.id IN (c.user1,c.user2) 
WHERE c.id IS NULL; 

SQLFiddleでテストしました。

+0

このエラーが発生しました '構文エラーまたはアクセス違反:1055 SELECTリストの式#3がGROUP BY句になく、非集約列のメッセージを含んでいます。GROUP BY句の列に機能的に依存していない「受取人」。これはsql_mode = only_full_group_by 'と互換性がありません – DMH

+0

「受信者」をGROUP BYに追加しました。今すぐやってみて下さい。 – wast

+0

エラーはなくなりましたが、会話をしていないユーザーは返されません。 nullまたは<3 – DMH

関連する問題