0

次のテーブルがあります。

users
+----------+----------+----------+
| id       | name     | dob      |
+----------+----------+----------+

authentications
+----------+----------+----------+ 
| id       | user_id  | provider |
+----------+----------+----------+

ユーザーには、多くの認証があります。user_idin the authenticationstable はテーブルへの外部キーusersです。

次の出力を完成させようとしています:

+---------------+---------------+---------------+---------------+ 
|    user.id    |   user.name   |   user.dob    |       C       |
+---------------+---------------+---------------+---------------+

ここで、C は、プロバイダーが「facebook」であるユーザー認証の数です。カウントの代わりにブール値、つまり認証が存在する場合は true、存在しない場合は false を取得できれば、さらに良いでしょう。

クエリの作成方法がわかりません。どんなポインタでも大歓迎です。

4

4 に答える 4

2

ユーザーと認証の間の JOIN を使用してクエリを作成し、最初に User Id フィールドに GROUP BY を追加します。group by には、結果にリストしたい後続のフィールドを含める必要がありますが、結果の効果は変わりません。

SELECT u.id, u.name, u.dob, COUNT(a.user_id) as authCount
FROM users u 
LEFT JOIN authentications a on u.id = a.user_id
WHERE a.provider = 'facebook'
GROUP BY u.id, u.name, u.dob
于 2012-05-23T14:44:16.953 に答える
0

1)これにより、すべてのユーザーのタイプFBの認証の実際のカウントが返されます。

`

Select Name UserName, ID UserID, COUNT(FBAuth) FBAuthCount
from Users LEFT JOIN
(Select UserID, COUNT(AuthType) FBAuth from Auth 
Where AuthType = 'FB'
Group by USERID) Auths on (Users.ID = Auths.UserId)
Group by ID, Name

`

2)これにより、認証タイプに応じて、すべてのユーザーに対してtrueまたはfalseのフラグが返されます。

`

Select Name UserName, ID UserID, 
CASE WHEN COUNT(FBAuth) > 0 THEN 'TRUE' ELSE 'FALSE' END FBAuthFLAG
from Users LEFT JOIN 
(Select UserID, COUNT(AuthType) FBAuth from Auth 
Where AuthType = 'FB'
Group by USERID) Auths on (Users.ID = Auths.UserId)
Group by ID, Name

`

小さいデータセットで結合を使用すると、応答が速くなります。最後に、これが1つだと思います。

`

SELECT users.id,
       users.email,
       users.name,
       users.sid,
       users.created_at,
       ( CASE
           WHEN fb_auth > 0
           THEN 'true'
           ELSE 'false'
         END ) AS facebook
FROM   users
       LEFT JOIN (SELECT authentications.user_id,
                         Count(authentications.provider) fb_auth
                  FROM   authentications
                  WHERE  provider = 'facebook'
                  GROUP  BY user_id) auths
              ON ( users.id = auths.user_id )
GROUP  BY users.id,
          users.email,
          users.name,
          users.sid,
          users.created_at

`

于 2012-06-21T10:23:08.883 に答える
0

C はカウントです。B は、Facebook プロバイダーがある場合は 1 を返し、そうでない場合は 0 を返します (ブール値)。すべてのユーザーが含まれるように、LEFT OUTER JOIN を使用するように更新されました。

SELECT 
   users.id,
   users.name,
   users.DOB,
   SUM(CASE WHEN authentications.provider = 'facebook' then 1 else 0 end) as C,
   MAX(CASE WHEN authentications.provider = 'facebook' then 1 else 0 end) as B
FROM users
LEFT OUTER JOIN authentications
   ON users.id = authentications.user_id
GROUP BY users.id, users.name, users.DOB
于 2012-05-23T14:43:20.437 に答える
-1

以前の回答は機能しましたが、非常に遅かったです。クエリの実行には 15 ~ 20 分かかりました。友人から提案されたこれは、はるかに高速に実行されます (同じデータセットで最大 4 秒)。

SELECT users.id,
       users.email,
       users.name,
       users.sid,
       users.created_at,
       ( CASE
           WHEN fb_auth > 0
           THEN 'true'
           ELSE 'false'
         END ) AS facebook
FROM   users
       LEFT JOIN (SELECT authentications.user_id,
                         Count(authentications.provider) fb_auth
                  FROM   authentications
                  WHERE  provider = 'facebook'
                  GROUP  BY user_id) auths
              ON ( users.id = auths.user_id )
GROUP  BY users.id,
          users.email,
          users.name,
          users.sid,
          users.created_at;
于 2012-06-19T06:58:33.260 に答える