0

次のようなBobというユーザーを持つusersというテーブルがあります。

username
  Bob

次の行を持つmailという別のテーブルがあります。

sender | receiver
Marley | Bob
 Saget | Bob 

次の行を持つblockという別のテーブルがあります。

blocker | blocked
 Marley | Bob

テーブルユーザーと受信したメッセージの数からユーザーを選択したいのですが、ブロックされたユーザーからのメッセージは無視します。したがって、結果は次のようになります。

users.username | count_mail 
 Bob           |  1 

ご覧のとおり、ボブがマーリーをブロックしてから受信したメッセージの数は1つだけなので、サゲットによるメッセージは1つだけカウントされるはずです。

次のクエリを使用しましたが、何も返されません。

SELECT user, COUNT(mail) AS count_mail FROM users 
LEFT JOIN block ON (block.blocker = users.username) 
LEFT JOIN mail ON (mail.receiver = users.username 
                   AND mail.sender <> block.blocked)

ありがとう

4

2 に答える 2

1

これを試して:

SELECT users.username, COUNT(mail.receiver) AS count_mail
FROM users 
LEFT JOIN mail ON mail.receiver = users.username 
LEFT JOIN block ON block.blocker = users.username
    AND mail.sender = block.blocked
WHERE block.blocked IS NULL
GROUP BY 1

これは、ブロッカーへの左側の結合が失敗した場合にのみヒットを取得するため、機能します。これは、非結合の where 句のテイスティングによってアサートされます。

于 2013-03-20T20:21:56.413 に答える
1

これを試して

SELECT user, COUNT(mail) AS count_mail FROM users 
LEFT JOIN mail ON (mail.receiver = users.username)
WHERE (mail.sender is null 
         or NOT EXISTS
             (SELECT 1 FROM block 
              WHERE mail.sender = block.blocker
              AND mail.receiver = block.blocked)
      )

また

SELECT user, COUNT(mail) AS count_mail FROM users 
LEFT JOIN (SELECT * FROM mail WHERE NOT EXISTS
                 (SELECT 1 FROM block 
                   WHERE mail.sender = block.blocker
                   AND mail.receiver = block.blocked)
          ) mail ON (mail.receiver = users.username)
于 2013-03-20T20:08:54.303 に答える