如何使用单个查询计算SQL(MySQL)表中行的出现概率?

我有一个表,其中包含一些类似的行,它们代表游戏的对象。我使用此表作为随机选择对象的方法。当然,我忽略了表的大小。我的问题是,我希望有一个查询,该查询返回选择每个对象的可能性,而我不知道该如何进行。

我可以获得表中的对象总数:

select count(id) from objects_desert_tb;

返回哪个

+-----------+
| count(id) |
+-----------+
|        81 |
+-----------+
1 row in set (0.00 sec)

我有一个查询,返回表中每个对象的出现次数:

select name,(count(name)) from objects_desert_tb group by name;

给出:

+-------------------+---------------+
| name              | (count(name)) |
+-------------------+---------------+
| carrots           |             5 |
| metal_scraps      |            14 |
| plastic_tarpaulin |             8 |
| rocks_and_stones  |            30 |
| wood_scraps       |            24 |
+-------------------+---------------+
5 rows in set (0.00 sec)

计算每个对象的概率仅在于将(count(name))除以表中的总行数。例如,对于胡萝卜行,只需从上面给出的两个查询中计算出5/81。我想返回一个查询:

+-------------------+---------------+
| carrots           |             5/81 = 0.06172839
| metal_scraps      |            0.1728...
| plastic_tarpaulin |            0.09876...
| rocks_and_stones  |            0.37...
| wood_scraps       |            0.29...
+-------------------+---------------+

是否可以使用表的大小作为SQL查询中的变量?也许通过嵌套几个查询?

nuoyi1024 回答:如何使用单个查询计算SQL(MySQL)表中行的出现概率?

交叉加入您的查询:

select c.name,c.counter / t.total probability
from (
  select name,count(name) counter 
  from objects_desert_tb 
  group by name
) c cross join (
  select count(id) total 
  from objects_desert_tb 
) t 
,

在MySQL 8+中,您将只使用窗口函数:

select name,count(*) as cnt,count(*) / sum(count(*)) over () as ratio
from objects_desert_tb 
group by name;
本文链接:https://www.f2er.com/3089006.html

大家都在问