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

时间:2019-05-04 21:25:49

标签: php mysql sql count max

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

3 个答案:

答案 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