gpt4 book ai didi

php - 如何在保留查询结果的同时从查询中检索 MAX()?

转载 作者:行者123 更新时间:2023-11-29 16:03:07 25 4
gpt4 key购买 nike

我想为我的数据库中的一些统计数据制作一个简单的条形图。更具体地说:这是一个家谱,我想显示每月的出生频率。我设法创建 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>";
}
?>

这是我必须显示月份列表的代码。我已将最大变量命名为“birthmax”,我只是不知道如何为其赋值。该值应该是“总计”中最大的结果。“Barwidth”是我要显示的彩色条的计算大小。按照原样的代码,由于缺少birthmax值,因此会显示条形图、月份和数字,但条形图是全宽的,这表明分配给barwidth的值不是数字(NAN)。

最佳答案

如果您使用的是 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

关于php - 如何在保留查询结果的同时从查询中检索 MAX()?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55986945/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com