Php 按性别和种族进行搜索和计数

Php 按性别和种族进行搜索和计数,php,mysql,Php,Mysql,我只是想知道一些关于性别和种族的想法。数据应显示如下所示: ----------------------------- course | Malay | chinese | | M | F | M | F | ----------------------------- science | 0 | 1 | 0 | 0 | ----------------------------- business | 0 | 0 | 1 | 0 | //这是表格结构

我只是想知道一些关于性别和种族的想法。数据应显示如下所示:

-----------------------------
course   | Malay  | chinese | 
         | M | F  |  M | F  |
-----------------------------
science  | 0 | 1  |  0 | 0  |
-----------------------------
business | 0 | 0  | 1  | 0  |
//这是表格结构

$sql = "CREATE TABLE student (
id INT(6) UNSIGNED AUTO_INCREMENT PRIMARY KEY, 
name VARCHAR(30) NOT NULL,
gender VARCHAR(30) NOT NULL,
race VARCHAR(50),
session VARCHAR(50),
course VARCHAR(50),
)";
示例数据


id |姓名|性别|种族|课程|课程 98773552 |努鲁尔|女性|马来| 2014年6月|科学计算机 5273544 |李|男|中文| 2012年6月|商业研究

我已经拥有的代码:

<?php
include "connect_db.php";
if ((isset($_POST['submit'])) AND ($_POST['search'] <> "")) {

    $search = $_POST['search'];

    $sql = "SELECT gender, count(gender) AS cnt FROM student WHERE session LIKE '%$search%' AND gender IN ('Male', 'Female') GROUP BY gender" or die(mysqli_error(
        ''
    ));
    $result = $conn->query($sql);

    while ($row = fetch_assoc($result)) {
        $dataSet->addPoint(new Point($row['gender'], $row['cnt']));

    }

}

作为一个初始想法,您希望生成一个包含所有可能组合的结果集

理想情况下,你会有一个性别表,一个种族表和一个课程表,然后你可以交叉连接这些以获得所有的组合,然后左连接学生表以获得计数

如果失败,则可以使用子查询获取可能的值,如下所示:-

$sql = "SELECT c.course,
                r.race,
                g.gender,
                COUNT(s.id)
        FROM
        (
            SELECT DISTINCT race
            FROM student
        ) r
        CROSS JOIN
        (
            SELECT DISTINCT gender
            FROM student
            WHERE gender IN ('Male', 'Female')
        ) g
        CROSS JOIN
        (
            SELECT DISTINCT course
            FROM student
        ) c
        LEFT OUTER JOIN student s
        ON r.race = s.race
        AND g.gender = s.gender
        AND c.course = s.course
        AND session LIKE '%".$conn->escape($search)."%' 
        GROUP BY c.course, r.race, g.gender" or die(mysqli_error(''));
然后,只需简单的php就可以将其放在一个表中,当课程发生变化时,将表中的一行放出来

编辑

以下内容完全未经测试,但希望能让您了解如何使用两个标题行呼应该表:-

<?php

include "connect_db.php";
if ((isset($_POST['submit'])) AND ($_POST['search'] <> "")) 
{

    $search = $_POST['search'];

$sql = "SELECT c.course,
                r.race,
                g.gender,
                COUNT(s.id) AS res_cnt
        FROM
        (
            SELECT DISTINCT race
            FROM student
        ) r
        CROSS JOIN
        (
            SELECT DISTINCT gender
            FROM student
            WHERE gender IN ('Male', 'Female')
        ) g
        CROSS JOIN
        (
            SELECT DISTINCT course
            FROM student
        ) c
        LEFT OUTER JOIN student s
        ON r.race = s.race
        AND g.gender = s.gender
        AND c.course = s.course
        AND session LIKE '%".$conn->escape($search)."%' 
        GROUP BY c.course, r.race, g.gender" or die(mysqli_error(
        ''
    ));
    $result = $conn->query($sql);

    echo "<table>";
    $header1 = "<tr><td rowspan='2'>course</td>";
    $header2 = "<tr>";
    $out_row = "<tr>";
    $prev_course = '';
    $prev_race = '';
    $first_row = true;
    while ($row = $conn->fetch_assoc($result)) 
    {
        if ($prev_course != $row['course'] and $prev_course != '')
        {
            if ($first_row)
            {
                echo $header1."</tr>";
                echo $header2."</tr>";
                $first_row = false;
            }
            echo $out_row."</tr>";
            $out_row = "<tr>";
            $prev_course = $row['course'];
        }
        if ($first_row)
        {
            if ($prev_race != $row['race'])
            {
                $header1 .= "<td colspan='2'>".$row['race']."</td>";
                $prev_race = $row['race'];
            }
            $header2 .= "<td>".$row['gender']."</td>";
        }
        $out_row .= "<td>".$row['res_cnt']."</td>";
    }
    if ($prev_course != $row['course'] and $prev_course != '')
    {
        if ($first_row)
        {
            echo $header1."</tr>";
            echo $header2."</tr>";
            $first_row = false;
        }
        echo $out_row."</tr>";
        $out_row = "<tr>";
        $prev_course = $row['course'];
    }
    echo "</table>";

}

您的代码中缺少太多内容。做更多的研究,构建代码。我不认为这里的任何人会为你写代码,除非你有一个具体的问题。首先,您是否尝试运行此代码?查找错误并尝试更正您的表结构是什么?至少您应该给出表结构。我无法找到给定的试用代码与预期输出之间的任何关系。另外,请先自己试试。@csaw我打赌有人会:-(您需要转义搜索字符串。我只是猜测您使用的连接类有一个转义方法。如果不将其更改为可用的适当方法。您能告诉我如何使用php在表中输出…因为我尝试并得到错误…添加了一个建议,但它完全未经测试。两个标题行是一个痛苦的问题,我需要我得到了一个致命的错误:在第65行的D:\xampp\htdocs\xxxx\t_2.php中的一个非对象上调用成员函数fetch_assoc()
而($row=fetch_assoc($result))可以发布一些测试数据,然后我将尝试测试它。