【问题标题】:How to retrieve a MAX() from a query while keeping the query result?如何在保留查询结果的同时从查询中检索 MAX()?
【发布时间】:2019-05-04 21:25:48
【问题描述】:

我想为我的数据库中的一些统计数据制作一个简单的条形图。更具体地说:这是一个家谱,我想显示每个月的出生频率。我设法创建了 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”,只是不知道如何为其赋值。该值应该是“总计”的最大结果。 “条形宽度”是我要显示的彩色条的计算大小。使用代码原样,因此缺少birthmax 的值,会显示条形、月份和数字,但条形是全宽的,表示分配给 barwidth 的值不是数字 (NAN)。

【问题讨论】:

  • 您的查询甚至无效,请参阅MySQL Handling of GROUP BY
  • 查询本身完美运行,在我的网站上的两个 phpMyAdmin 中......无论如何,它会根据我的需要显示结果。为什么它会无效?我唯一能看到的是我宁愿按 MONTH(birthdaretr) 订购,但这也有效......

标签: php mysql sql count max


【解决方案1】:

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


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
  • 仅供参考,我在 phpMyAdmin 中尝试了您的查询,并且它运行良好......就像 Moneer 提供的其他解决方案一样。我不知道为什么我的代码无法将 $barwidth 识别为数字...
  • 在你的问题中,你在 for 循环之前有这行 $barwidth = floor($Total / $birthmax * 100); 。 $Total 和 $birthmax 未定义。如果将它移到 for 循环中并将其更改为 $barwidth = floor($row['Total'] /$row['max_total'] * 100); 它应该可以工作
  • “不幸的是,我的提供商只支持最高 7.02.17 的 MYSQL” MySQL 7 我错过了什么吗? @TomHuygens MySQL 6 和 7 从未存在过,MySQL 从 MySQL 5.7 直接升级到 MySQL 8.. 7.02.17 最有可能是您的 PHP 版本?
  • @RaymondNijland 哎呀......是的,这是我的 php 版本......请耐心等待,我是初学者。
【解决方案2】:

一个解决方案是一个子查询,它的计数最高。

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);

【讨论】:

  • 不幸的是,这破坏了代码。什么都没有显示。
【解决方案3】:

我不知道我的想法是否正确,但我相信你可以使用子查询

  SELECT
        MONTHNAME(birthdatetr) AS Month_of_Birth,
        MONTH(birthdatetr) AS number_of_month_of_birth,
        COUNT(*) AS Total,
(select count(*) FROM tng_people
               WHERE month(birthdatetr) > 0
               GROUP BY month(birthdatetr)
               ORDER BY count(*) DESC
               limit 1) as birthmax
    FROM
        tng_people
    WHERE
        MONTH(birthdatetr) > 0
    GROUP BY
        number_of_month_of_birth
    ORDER BY
        number_of_month_of_birth

【讨论】:

  • 感谢您的建议,但作为另一个答案,不幸的是它根本没有返回任何结果。它破坏了完整的 php。
  • 对不起,我的错误。我在某处忘记了“,”。它现在显示和以前一样,说birthmax不是一个数字......当我在MySQL中隔离子查询时,它确实给出了一个数字。
  • 在mysql中运行查询会得到什么(完整的查询)
  • 在 phpMyAdmin 中执行查询时,它给出了我正在寻找的内容。完整的表,每个月的数字,并添加了最大数量的列(每行相同)。所以问题可能出在 WordPress 处理代码的某个地方......感谢您的帮助,至少我知道这个解决方案在正常情况下有效!
  • 尝试使用 var_dump($result) ; die() 看看你得到了什么值,并将 width:{$barwidth} 更改为 $row[barwidth']
猜你喜欢
  • 1970-01-01
  • 2021-07-12
  • 1970-01-01
  • 1970-01-01
  • 2020-06-23
  • 1970-01-01
  • 2012-11-27
  • 1970-01-01
  • 2023-03-17
相关资源
最近更新 更多