表连接问题与MySQL

时间:2011-12-15 23:47:13

标签: mysql sql

我有一个推荐用户的表(包含电子邮件地址和日期列)和一个供用户使用的表。

我跑去获得顶级参赛者:

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

但是我想将它与users表连接起来,以便与用户表中的其他数据一起显示,我认为连接可以正常工作。左连接因为电子邮件输入可能不正确,有些人在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

使用上述查询计数不正确,但我不知道原因。

4 个答案:

答案 0 :(得分: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

如果您从用户添加新列,则还需要将其添加到group by子句中。

此致

答案 1 :(得分:0)

不幸的是,LEFT JOIN在这里不会帮到你;这种类型的连接所说的是给我与用户电子邮件匹配的所有行,以及所有与电子邮件不匹配的行。如果电子邮件不符合,那么他们就不会回来了。

所以你不能以你想要的方式使用左连接条件。

如果您强制执行每次都必须输入电子邮件的事实,并且它是有效的电子邮件等,那么您可以使用INNER JOIN。

JOIN通常用于遵循参照完整性。因此,例如,我有一个用户在一个表中有一个id,另一个用户用userid用户表 - 我可以加入的两个表之间有很强的关系。

Jeft Atwood很好地解释了联接是如何工作的。

答案 2 :(得分: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 

您可以尝试将计数查询用作子查询表类型,而不是直接连接。

答案 3 :(得分: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

这告诉我,计数错误的原因是因为某些电子邮件地址在用户表中使用了两次(用户共享“家庭”电子邮件地址),这使我的计数增加了一倍,上面的查询显示了每个单独的用户帐户。