我有一个推荐用户的表(包含电子邮件地址和日期列)和一个供用户使用的表。
我跑去获得顶级参赛者:
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
使用上述查询计数不正确,但我不知道原因。
答案 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
这告诉我,计数错误的原因是因为某些电子邮件地址在用户表中使用了两次(用户共享“家庭”电子邮件地址),这使我的计数增加了一倍,上面的查询显示了每个单独的用户帐户。