我在MySQL中有两个表容纳用户,另一个表容纳订阅。有些用户可能已签名,但他们没有订阅。我使用以下查询来获取他们没有任何订阅的用户数:
SELECT COUNT(social_users.id) FROM social_users LEFT JOIN socials
ON social_users.id = socials.social_user_id
WHERE socials.social_user_id IS NULL
上面的查询运行良好,并返回一个数字,该数字是没有任何订阅的用户数。
现在,我想得到相对于用户总数的百分比。因此,我尝试进行两次SQL查询,并将它们划分如下:
(SELECT COUNT(social_users.id) FROM social_users LEFT JOIN socials ON
social_users.id = socials.social_user_id WHERE socials.social_user_id
IS NULL) / select count(social_users.id) FROM social_users
但是,此查询不起作用。因此,我需要知道任何其他方法,允许我嵌入两个select,并将其除以,然后将结果乘以100。
尝试类似的东西
Select ( (SELECT COUNT(social_users.id) FROM social_users LEFT JOIN socials ON
social_users.id = socials.social_user_id WHERE socials.social_user_id
IS NULL) / (select count(social_users.id) FROM social_users))*100 as Percentage
应该没有理由两次查询相同的表。如果您采用用户表,并通过社交表进行外部联接,按用户id分组,则可以对每个用户的订阅进行计数。那些没有订阅的用户的计数将为零。
然后将其输入到一个查询中,该查询基本上只计算零的数量,除以用户总数,et viola:
SELECT Sum( case TotalSubs when 0 then 1 else 0 end ) NonSubscribers,
Count( user_id ) TotalUsers,
100 * Sum( case TotalSubs when 0 then 1 else 0 end ) /
Count( user_id ) Ratio
FROM(
select u.ID user_id, Count( s.ID ) TotalSubs
from social_users u
left join socials s
ON s.social_user_id = u.id
group by u.id ) x;
您还希望100.0 *
是比率方程式中的第一个值。考虑:
select 1 / 3 * 100.0 PostAnswer, 100.0 * 1 / 3 PreAnswer;
返回
PostAnswer PreAnswer
0.0 33.33333
或者在除法之前将这两项显式强制转换为浮点值。在等式中混合整数和实数时,一定要注意。
您也可以尝试以下查询。我在这里假设一个用户可以有多个订阅。这个查询的好处是在一个查询中获得百分比,因此将是更高性能的
select sum(socials.user_id is null)/count(distinct social_users.id) from social_users
left join socials on socials.user_id = social_users.id
我必须在分母上加上distinct,因为如果用户可以有多个订阅,就会导致多行,如果你确定每个用户有一个订阅,你可以去掉distinct并使这个查询更具性能