1

質問に関連することのみを説明し、その他の無関係な詳細は省略します。

現在の状況:

コインとユーザーの 2 つのテーブルがあります。

coinid, uid, fid. コイン テーブルには、ユーザー (システムに既に登録されており、友人を招待できるユーザー) とその友人 (既に招待を受け入れ、メンバーになったユーザー) との間で関連付け られる 3 つのフィールドがあります。

idユニークなインデックスです。
uidユーザーIDを保存することです。
fid友達ID(招待を受けてシステムのメンバーになった友達)を保存することです。

usersid, fname, lname, email...etc などのユーザーに関する通常の情報があり、date_create

目的:最も多くの招待を行った勝者 を見つけること。言い換えると。最も多くの招待を行ったトップ ユーザーとその招待された友人を見つけるには、2012 年 8 月 31 日より前に登録している必要があります。日付はテーブル 'users' 列 date_create に格納されます。日付形式は yyyy-mm-dd です

例-

Table coin

    id uid fid 
    1  333 777   
    2  444 888       
    3  555 999       
    4  333 123         
    5  444 456         
    6  333 789   

Table users
    id   date_create
    333  2012-07-15
    444  2012-07-20
    555  2012-07-25
    777  2012-07-25
    888  2012-07-25
    999  2012-10-02   <-- I don't need this to be counted
    123  2012-07-25
    456  2012-07-25
    789  2012-07-25

ユーザー 333 が最も多くの招待 (招待された 3 ユーザー) を持っていることを意味します -> 777,123 および 789、ユーザー 444 は 2 ユーザーを招待し、ユーザー 555 は 1 ユーザーのみを招待しましたが、555 については、彼の友人 (999 人) が 2012 年以降に登録したため、カウントされません。 -08-31

私が欲しいのはユーザーです

333 has made 3 invitations before 2012-08-31. 
444 has made 2 invitations before 2012-08-31.

私がこれまでに行ったことは次のとおりです。[これについてはまったく確信が持てません]

SELECT
  c.uid,       
  u.fname,
  u.lname,
  u.phone,
  u.email,
  u.country,
  COUNT(c.fid)    AS NoOfFriends
FROM coin AS c
  JOIN users AS u
    ON c.uid = u.id
GROUP BY c.uid
ORDER BY NoOfFriends desc

このクエリは、(私の知る限り)友人がいつ登録したかに関係なく、ほとんどの招待状を持つユーザーをもたらします。

だから私の質問は: Q1) 日付条件をクエリに適用する方法は?

友達招待数が一番多いユーザーが欲しいです。招待された友人は、2012 年 8 月 31 日より前に招待を受け入れ、登録している必要があります。その日以降に受け入れられた他の招待状はカウントされません。

コード例を教えてください。

4

5 に答える 5

2

SUM次のものと組み合わせて使用​​できますCASE

SUM(CASE WHEN <cond> THEN 1 ELSE 0 END) as NoOfFriends

完全なステートメントは次のようになります。

SELECT
  c.uid,
  u.fname,
  u.lname,
  u.phone,
  u.email,
  u.country,
  u.`date_create`,
  SUM(CASE WHEN f.date_create < 2012-10-31 THEN 1 ELSE 0 END)    AS NoOfFriends
FROM coin AS c
  JOIN users AS u
    ON c.uid = u.id
  join users as f
    on c.fid = f.id
GROUP BY c.uid, u.fname, u.lname, u.phone, u.email, u.country, u.`date_create`
ORDER BY NoOfFriends desc
于 2012-10-11T12:18:24.367 に答える
2

多くの回答は、実際のユーザーと招待された友人を混同していました。

SELECT
    c.uid
info.fname,
info.lname,
info.phone,
info.email,
info.country,
info.date_create,
    COUNT(c.fid) AS [NoOfFriends]
FROM coin AS c
    JOIN users AS friend
        ON c.fid = friend.id
    LEFT JOIN users AS info
        ON c.uid = info.id
WHERE friend.date_create < '20121031'
GROUP BY c.uid

EDITデータ形式を修正

于 2012-10-11T12:30:50.493 に答える
0

これが私の答えです。試して助けてくれたすべての人、特に実際のソリューションを迅速に提供してくれた LastCoder に感謝します。

SELECT
  c.uid,
  info.id,
  info.fname,
  info.lname,
  info.phone,
  info.email,
  info.country,
  COUNT(DISTINCT c.fid) AS NoOfFriends   -- modified this to get unique invitations
FROM coin c
  JOIN users AS friends
    ON c.fid = friends.id
  LEFT JOIN users AS info
    ON c.uid = info.id
WHERE friends.date_create < '20120831'
GROUP BY c.uid
ORDER BY NoOfFriends DESC
LIMIT 10

SUM(CASE WHEN ...)正直なところ、明確に理解できないため、他のソリューションは使用しませんでし た。

于 2012-10-12T10:27:39.250 に答える
0

グループ化のみの方法はc.uidMySQL で機能しますが、他の RDBMS では行き詰まります。

この状況では、カウントをサブクエリに移動します。私の意見では、読みやすく、適用しようとしているロジックからクエリをうまく分離します。つまり、友人が特定の日付より前に登録したすべての招待を取得します。その後、招待したユーザーに再び参加します。

SELECT  u.ID,
        u.fname,
        u.lname,
        u.phone,
        u.email,
        u.country,
        u.`date_create`,
        COALESCE(FriendCount, 0) AS FriendCount
        COALESCE(FriendCount2, 0) AS FriendCount2
FROM    users AS u
        LEFT JOIN  
        (   SELECT  coin.UID,
                    COUNT(coind.fid) AS FriendCount,
                    COUNT(CASE WHEN Users.Date_Create < '20121031' THEN coind.fid END) AS FriendCount2
            FROM    coin
                    INNER JOIN Users
                        ON coin.FID = users.ID
            GROUP BY coin.UID
        ) c
            ON c.uid = u.id
ORDER BY FriendCount2 DESC

10 月 31 日より前の友達だけを気にする場合は、これを次のように単純化できます。

SELECT  u.ID,
        u.fname,
        u.lname,
        u.phone,
        u.email,
        u.country,
        u.`date_create`,
        COALESCE(FriendCount, 0) AS FriendCount
FROM    users AS u
        LEFT JOIN  
        (   SELECT  coin.UID,
                    COUNT(coind.fid) AS FriendCount
            FROM    coin
                    INNER JOIN Users
                        ON coin.FID = users.ID
            WHERE   Users.Date_Create < '20121031'
            GROUP BY coin.UID
        ) c
            ON c.uid = u.id
ORDER BY FriendCount DESC
于 2012-10-11T12:34:54.960 に答える
0

このcount(expression)関数は、その式の結果が null ではない行をカウントします。式が true または false を返すだけの場合、true と false の両方が null ではないため、すべての行がカウントされます。

カウントで式を使用するには、false の場合は null を返すようにする必要があります。

 COUNT(friend.date_create < '2012-10-31' or null) AS NoOfFriends
于 2012-10-11T12:37:50.333 に答える