我想在数据库中制作一些统计数据的简单条形图。更具体地说:这是一棵家谱,我想显示每月的出生频率。我设法创建了SQL查询,以获取带有相应出生日期的月份列表。现在,我想添加一个彩色的条,最高的数字是100%的宽度,其他的数字是成比例的。
要计算百分比,我需要从查询结果中获取最大的数字。但是,我不需要显示它。我只需要数字就可以用它来计算条的宽度。
我用MAX()尝试了不同的解决方案,但是所有这些解决方案都设置为仅显示COUNT()的最大值。如前所述,我想显示完整结果,并且只需要内部使用MAX()进行计算。我不需要显示它。
通过按COUNT()进行SELECT()查询排序并将其限制为第一个结果,很容易检索数字。由于所需的MAX()结果只有一个数字,因此我无法与其他SELECT查询(每个月获取给我数字)进行UNION。 第二个问题是,要显示的结果显然不是按COUNT()排序的,而是按月排序的。因此,此时MAX()数将是第三个结果,尽管当我添加到数据库中时,它可能会改变。
<?php
require_once(ABSPATH . 'wp-settings.php');
$connection = mysqli_connect(DB_HOST, DB_USER, DB_PASSWORD);
mysqli_select_db($connection, DB_NAME);
$query = "SELECT
MONTHNAME(birthdatetr) AS Month_of_Birth,
MONTH(birthdatetr) AS number_of_month_of_birth,
COUNT(*) AS Total
FROM
tng_people
WHERE
MONTH(birthdatetr) > 0
GROUP BY
number_of_month_of_birth
ORDER BY
number_of_month_of_birth";
$result = mysqli_query($connection, $query);
$barwidth = floor($Total / $birthmax * 100);
?>
<?php foreach ($result as $row){
echo "{$row['Month_of_Birth']} ({$row['Total']})
<td class=\"bar-holder\"><div style=\"width:{$barwidth}%;\" class=\"bar rightround\"></div></td>";
}
?>
这是我必须显示月份列表的代码。我已将max-variable命名为“ birthmax”,但我只是不知道如何为其分配值。该值应该是“总计”的最大结果。 “ Barwidth”是我要显示的彩条的计算大小。照原样编写代码,因此缺少birthmax的值,但会显示条形图,月份和数字,但条形图为全角,表示分配给条形宽度的值不是数字(NAN)。
答案 0 :(得分:0)
一个解决方案是子查询,该查询的计数最高。
SELECT monthname(birthdatetr) month_of_birth,
month(birthdatetr) number_of_month_of_birth,
count(*) total,
(SELECT count(*)
FROM tng_people
WHERE month(birthdatetr) > 0
GROUP BY month(birthdatetr)
ORDER BY count(*) DESC
LIMIT 1) overall_total
FROM tng_people
WHERE month(birthdatetr) > 0
GROUP BY month(birthdatetr)
ORDER BY month(birthdatetr);
答案 1 :(得分:0)
我不知道我的想法是否正确,但我相信您可以使用子查询
ModalDialogButton
答案 2 :(得分:0)
如果使用的是MYSQL 8.0及更高版本,则可以使用WITH
创建两个表,即已创建的表和仅具有最大值的表。然后交叉联接两个表以将最大值添加到每一行。
您还可以选择Total / max_total以获得介于0和1之间的百分比。
WITH query_data AS (
SELECT
MONTHNAME(birthdatetr) AS Month_of_Birth,
MONTH(birthdatetr) AS number_of_month_of_birth,
COUNT(*) AS Total
FROM
tng_people
WHERE
MONTH(birthdatetr) > 0
GROUP BY
number_of_month_of_birth
),
max_count AS (
SELECT MAX(Total) AS max_total FROM query_data
)
SELECT query_data.*, max_count.max_total
FROM query_data CROSS JOIN max_count
ORDER BY
query_data.number_of_month_of_birth
对于mysql <8.0,您可以像这样连接两个表:
SELECT query_data.*, max_count.max_total
FROM (
SELECT
MONTHNAME(birthdatetr) AS Month_of_Birth,
MONTH(birthdatetr) AS number_of_month_of_birth,
COUNT(*) AS Total
FROM
tng_people
WHERE
MONTH(birthdatetr) > 0
GROUP BY
number_of_month_of_birth
) query_data
CROSS JOIN (
SELECT MAX(tmp_max.Total) AS max_total FROM
(
SELECT
MONTHNAME(birthdatetr) AS Month_of_Birth,
MONTH(birthdatetr) AS number_of_month_of_birth,
COUNT(*) AS Total
FROM
tng_people
WHERE
MONTH(birthdatetr) > 0
GROUP BY
number_of_month_of_birth
) tmp_max
) max_count
ORDER BY
query_data.number_of_month_of_birth