2011-12-15 163 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 

不过,我想与用户表加入这个所以显示在用户表中的其他数据,我以为会一起工作。 LEFT JOIN监守电子邮件可能被输入不正确,有的人把名字等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列 - 我可以加入的两个表之间有很强的关系。

Jeft Atwood对加入工作有很好的解释。

+0

很确定我想在这里留下一个左连接,因为在用户表中没有条目的电子邮件将显示为空,这正是我想要的。 – Richard 2011-12-16 00:24:59

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 

如果从用户ú还需要by子句将其添加到您组添加新列。

问候

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

我写了这个查询

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 

其中显示了计数错误的原因是因为有些o如果电子邮件地址在用户表中使用两次(用户共享“家人”电子邮件地址),则此计数加倍,以上查询显示每个单独的用户帐户。