【问题标题】:PHP MySql percentagePHP MySql 百分比
【发布时间】:2012-09-25 14:03:18
【问题描述】:

我的问题是关于百分比的,我不是专家,所以我会尝试以更好的方式解释。

我的 mysql 服务器中有一个表,比如 700 条记录,类似这样

+-------+---------+----------+-------+
| Name  | country | language | Birth |
+-------+---------+----------+-------+
| Lucy  | UK      | EN       | 1980  |
| Mari  | Canada  | FR       | 1990  |
| Gary  | Canada  | EN       | 1982  |
| Stacy | Jamaica | EN       | 1986  |
| Joao  | Brasil  | PT       | 1984  |
+-------+---------+----------+-------+

所以我查询了1980年到1985年之间的所有记录,结果是:

+------+---------+----------+-------+
| Name | country | language | Birth |
+------+---------+----------+-------+
| Lucy | UK      | EN       | 1980  |
| Gary | Canada  | EN       | 1982  |
| Joao | Brasil  | PT       | 1984  |
+------+---------+----------+-------+

我想从这个结果中得到:

  1. 这些年之间每种语言出现的百分比

    EN = 75% (3 is the total in this case)
    PT = 25%
    
  2. 结果表中出现的每个国家/地区的百分比

    UK = 33%
    Canada = 33%
    Brasil = 33%
    

我的意思是如何将结果转换为变量以在最终函数中使用它们。

【问题讨论】:

  • 您在寻找 SQL 或 PHP 解决方案吗?
  • 两者,或者最好的一个,实际上是其中之一。
  • EN 75 的百分比如何?不应该是#1下面的EN = 66%, PT = 33%吗?
  • 对不起,我没有做数学,只是一目了然
  • 我认为如果我得到 php 解决方案会更好,我一直在尝试实现下面给出的解决方案,但我无法得到想要的结果

标签: php mysql percentage


【解决方案1】:

这可能有效,但类似于:

set @total_rows = (SELECT COUNT(*) FROM table WHERE Birth between 1980 and 1985);

SELECT language, percentage
FROM (
    SELECT language, concat(count(language)/@total_rows, "%") AS percentage 
    FROM table WHERE Birth between 1980 and 1985
)

【讨论】:

  • 虽然您的查询可能是正确的,但我认为它可能会使用大量资源来处理大量数据(7000、70 000、700 000 条记录)
  • 同意,使用用户定义的变量来执行一次总查询。不过希望看到其他更优化的解决方案。
  • 能否请您给我一个关于如何在 php 中实现此功能的线索,我一直无法做到。
  • @sixeightzero 你做对了,但是 MySQL 根本不是一个用来处理复杂 sql 查询的数据库——是的,它可以,但它更慢。我通常倾向于将查询分成几个而不是使用一个。这不是“最好”的方式,但它通常工作速度至少快 2 倍。如果是 PostgreSQL,我不会对那个查询有这样的问题。
【解决方案2】:

我会在这里回答,因为在评论中执行 SQL 不太舒服。

要获得百分比,您只需将之前的输出作为视图并添加百分比列,应该这样做:

select NAME, QUANTITY, QUANTITY/(select count(1) from TABLE) as PERCENTAGE
from (
    select NAME, count(1) as QUANTITY
    from TABLE
    where condition
    group by NAME
)

但这并没有真正优化,因为您每次想要获取单行时都会调用整个表的计数,即使 MySQL 会索引计数结果,它仍然不是最好的。

您应该首先将表格的总大小放入您的 php 中:

select count(1) as totalsize
from TABLE

然后在你的下一个请求中使用它:

select NAME, QUANTITY, QUANTITY/[totalsize from php] as PERCENTAGE
from (
    select NAME, count(1) as QUANTITY
    from TABLE
    where condition
    group by NAME
)

【讨论】:

  • 我需要一些进一步的帮助(一如既往)。第一个查询(totalsize)我必须把它放在我的php中吗? $query1 = "从 TABLE 中选择 count(1) 作为总大小";.而第二个查询应该是这样的: $query2 = "select NAME .......";
  • 第二个问题:[totalsize from php] 中的 php 是否需要替换?
猜你喜欢
  • 1970-01-01
  • 2013-03-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多