Mysql 如何为以下场景编写查询?

Mysql 如何为以下场景编写查询?,mysql,Mysql,我有一个类似这样的表——然后是另一个表(我们称之为“actions”表),其中包含所有用户所做的事情的列表 我如何编写一个查询来计算有多少新用户引用了referer\u id“1”,并且在“actions”表中至少有一个条目?例如,对于referer_id“1”,“1723”和“1724”在“actions”表中都至少有一行,但没有“1725”。因此对于用户“1”,他成功地推荐了2个用户,即使还有“1725” 希望这是有意义的。使用联接,您知道如果有一行,那么联接表中至少有一行匹配。您可以将其与

我有一个类似这样的表——然后是另一个表(我们称之为“actions”表),其中包含所有用户所做的事情的列表

我如何编写一个查询来计算有多少新用户引用了referer\u id“1”,并且在“actions”表中至少有一个条目?例如,对于referer_id“1”,“1723”和“1724”在“actions”表中都至少有一行,但没有“1725”。因此对于用户“1”,他成功地推荐了2个用户,即使还有“1725”


希望这是有意义的。

使用联接,您知道如果有一行,那么联接表中至少有一行匹配。您可以将其与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;

编辑:在考虑了一下之后,假设所有的东西都被索引了,我想不出一个更有效的解决方案。一些温和的谷歌搜索建议使用这个计数(不同的引用。新用户id)可能比使用分组依据更快。

使用联接时,您知道如果联接表中有一行,那么至少有一行匹配。您可以将其与分组依据相结合以提取唯一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;
编辑:考虑了一会儿之后,假设所有内容都已编入索引,我想不出更有效的解决方案。一些温和的谷歌搜索建议计数(不同的引用。新用户id)可能比使用分组方式更快。

给你:

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;
给你:

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;

如果将架构添加到问题中,则更容易理解您的问题。您可以通过运行
解释操作
显示创建表操作
来获取表定义。并对另一个表执行相同操作。这是“操作”-,这是“引用”“-.@Corbin的解决方案对你不起作用吗?什么不对?我觉得还可以。你有我可以使用的示例数据转储吗?当然,这里是“操作”的数据转储,这里是“推荐”的数据转储。正确的查询应该显示referenced_id“1”的referenced count为2,referenced_id“3”的referenced count为1。如果将架构添加到问题中,则更容易理解您的问题。您可以通过运行
explain actions
show create table actions
来获取表定义。对另一个表也一样。这里是“actions”,这里是“reference”。@Corbin的解决方案对你不起作用吗?什么不对?我觉得还可以。你有我可以使用的示例数据转储吗?当然,这里是“操作”的数据转储,这里是“推荐”的数据转储。正确的查询应显示引用的\u id“1”的引用计数为2,而引用的\u id“3”的引用计数为1。