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))可以发布一些测试数据,然后我将尝试测试它。