2011-12-15 19 views
1

私は、参照ユーザー(電子メールアドレスと日付列を含む)とユーザーのためのテーブルを持っています。テーブル参加のMySQL

私はトップリファラーを取得するために実行します。

SELECT count(r.Email) as count, r.Email 
FROM refs r 
WHERE r.referredOn > '2011-12-13' 
GROUP BY email 
ORDER BY count DESC 

をしかし、私はそれがユーザテーブルに他のデータと表示するので、ユーザーテーブルでこれに参加したい、私は参加が働くだろうと思いました。左が参加becuase電子メールが誤って入力してもよいし、一部の人々は上記のクエリでrefs.Email

SELECT count(r.Email) as count, r.Email, u.* 
FROM refs r LEFT JOIN users u ON u.email_primary = r.Email 
WHERE r.referredOn > '2011-12-13' 
GROUP BY email 
ORDER BY count DESC 

の下で最初の名前などを入れてカウントが正しくないですが、私は理由を知りません。

答えて

0

残念ながら、LEFT JOINはあなたをここで助けません。このタイプの結合では、ユーザーのすべての行が自分のメールに一致するだけでなく、メールに一致しないすべての行が表示されます。電子メールが一致しない場合、それらはあなたが望むように戻って来ません。

ここでは、左結合条件を使用することはできません。

メールを毎回入力する必要があり、有効なメールなどだった場合、INNER JOINを使用できます。

通常、JOINは参照整合性に従うために使用されます。たとえば、あるテーブルにIDを持つユーザーと、カラムのユーザーIDを持つテーブルがあります。私が参加できる2つのテーブルの間に強い関係があります。

Jeft Atwoodには、結合がどのように機能するかがよく分かります。

+0

usersテーブルのエントリのないメールはnullとして表示されるので、ここでは左の結合をしたいと思います。 – Richard

+0

はい。彼らが誰に属しているかをどのように知っていますか?あなたが次にできることは、誰にも属していないすべての電子メールを数えることです。また、あなたが言及しているように、人々がそこにメール以外の何かを入れているなら、彼らは決して何にもマッチしません。 – dash

+0

私は分かりませんが、null値はユーザーテーブルにない名前または電子メールを入力した場合に意味があるようです。私たちのトップの紹介者がどのように見えるかをより良く理解しようとしています。 +1は役に立つリンクです。 – Richard

1

この方法を試してください。

SELECT count(r.Email) as count, r.Email 
FROM refs r 
INNER JOIN users u ON u.email_primary = r.Email 
WHERE r.referredOn > '2011-12-13' 
GROUP BY email 
ORDER BY count DESC 

をあなたのuはあなたがまた句によって、あなたのグループにそれを追加する必要があるユーザーからの新しい列を追加する場合。

よろしく

0

これはあなたを助けるかどうかを確認:

SELECT e.count, e.email, u.col1, u.col2 -- etc 
FROM (
    SELECT count(r.Email) as count, r.Email 
    FROM refs r 
    WHERE r.referredOn > '2011-12-13' 
    GROUP BY email 
) e 
INNER JOIN 
users u ON u.email_primary = e.Email 

の代わりに直接参加するには、サブクエリ・テーブルタイプとしてあなたのカウントクエリを使用しようとすることができます。..

0

Iこのクエリを書いた

SELECT *, count(r.Email) as count FROM refs r 
LEFT OUTER JOIN users u ON r.email = u.email_primary 
WHERE u.uid IS NOT NULL 
GROUP BY u.uid 
ORDER BY count DESC 

私は、カウントが間違っていた理由は、電子メールアドレスがusersテーブル(ユーザが 'family'電子メールアドレスを共有するユーザ)で2回使用された場合、これは私の数を2倍にしました。