>

데이터베이스의 일부 통계를 간단한 막대 차트로 만들고 싶습니다. 보다 구체적으로 : 가계도이며, 매월 출생 빈도를 보여주고 싶습니다. 나는 각각의 출생 횟수와 함께 달의 목록을 얻기 위해 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"로 지정했습니다. 값을 할당하는 방법을 모르겠습니다. 값은 "Total"의 가장 큰 결과 여야합니다. "Barwidth"는 표시하려는 색상 막대의 계산 된 크기입니다. 코드를 그대로 사용하면 birthmax 값이 없으면 막대, 월 및 숫자가 표시되지만 막대가 전체 너비로 표시되어 barwidth에 지정된 값이 숫자 (NAN)가 아니라고 표시됩니다.

  • 답변 # 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<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
    
    

  • 답변 # 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
    
    

관련 자료

  • 이전 url rewrite module - IIS에서 경로 재 작성
  • 다음 c++ - OpenGL을 배우는 동안 glClear를 찾을 수 없습니다