2011-12-18 59 views
0

我有一个表,看起来像这样 - http://d.pr/jQ1P,然后另一个表(我们称之为“动作”表),其中包含所有用户已完成的事情列表。如何为以下方案编写查询?

如何编写一个查询,可以给我一个有多少新用户referrer_id“1”引用的计数,并且在“操作”表中至少还有一个条目?例如。对于referrer_id“1”,“1723”和“1724”在“动作”表中至少有1行,但不是“1725”。因此对于用户“1”,他已成功引用2个用户,即使还有“ 1725" 。

希望是有道理的。

+2

这将是更容易理解你的问题,如果你添加的架构,可以走进去。您可以通过运行'explain actions'或'show create table actions'来获得表格定义。并为另一个表做同样的事情。 – 2011-12-18 04:51:24

+0

这里是“行动” - http://d.pr/BHne,这里是“推荐” - http://d.pr/V2Ei。 – 2011-12-18 05:05:56

+0

科尔宾的解决方案不适合你吗? – 2011-12-18 05:29:05

回答

2

在这里你去:

SELECT 
    COUNT(DISTINCT r.new_user_id) 
FROM 
    referral r  
    JOIN actions a ON a.fk_userid = r.new_user_id 
WHERE 
    r.referrer_id = 1; 
2

使用JOIN,你知道,如果有一个排,那么至少1行中的JOIN表匹配。您可以结合起来,与一个GROUP BY拉。唯一的ID我有一种感觉,这可能是一个更有效的方式,但是,想到的第一件事就是:

SELECT 
    COUNT(referrals.new_user_id) 
FROM 
    referrals 
    JOIN actions ON actions.user_id = referrals.new_user_id 
WHERE 
    referrals.referrer_id = 1 
GROUP BY referrals.new_user_id; 

编辑:思考了一下,假设后,一切都被索引,一世想不到更有效的解决方案。一些轻微的谷歌搜索表明COUNT(DISTINCT referrals.new_user_id)可能会更快,而不是使用GROUP BY。