Как извлечь MAX () из запроса, сохранив результат запроса? - PullRequest
0 голосов
/ 05 мая 2019

Я хочу сделать простую гистограмму статистики в моей базе данных. Более конкретно: это семейное древо, и я хочу показать частоту рождений за месяц. Мне удалось создать SQL-запрос, чтобы получить список месяцев с соответствующим числом рождений. Теперь я хочу добавить цветную полосу, где наибольшее число равно 100% ширины, а остальные пропорциональны.

Чтобы рассчитать процент, мне нужно получить наибольшее число из результата запроса. Мне, однако, не нужно отображать это. Мне нужно только число, чтобы использовать его для расчета ширины полосы.

Я пробовал разные решения с MAX (), но все они были настроены на отображение только максимального значения COUNT (). Как уже упоминалось, я хочу отобразить полный результат, и мне нужен только MAX () для расчетов. Мне не нужно отображать его.

Получить номер легко, выполнив запрос SELECT (), упорядочив его по COUNT () и ограничив первым результатом. Поскольку необходимый результат MAX () - это только одно число, я не могу выполнить UNION с другим запросом SELECT, который получает мне числа в месяц. Вторая проблема заключается в том, что отображаемые результаты упорядочиваются не 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-переменную "birthmax", я просто не знаю, как присвоить ей значение. Значение должно быть наибольшим результатом «Всего». «Ширина» - это расчетный размер цветной полосы, которую я хочу отобразить. С кодом как есть, поэтому без значения рождения макс. Отображаются столбцы, месяцы и цифры, но столбец имеет полную ширину, что говорит о том, что значение, назначенное полосе пропускания, не является числом (NAN).

Ответы [ 3 ]

0 голосов
/ 05 мая 2019

Я не знаю, правильно ли я понял идею, но я верю, что вы можете использовать подзапрос

  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
0 голосов
/ 05 мая 2019

Если вы используете 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Вы можете объединить две таблицы следующим образом: </p>


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
0 голосов
/ 05 мая 2019

Один запрос - это подзапрос, который получает наибольшее количество.

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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...