Php 如何使用sql查询显示特定类别下的所有数据?
我有两个Mysql表,结构如下: 表工作 表格作业详细信息Php 如何使用sql查询显示特定类别下的所有数据?,php,mysql,sql,Php,Mysql,Sql,我有两个Mysql表,结构如下: 表工作 表格作业详细信息 job_cat_id---job_cat_name ========================= 1 cat name 1 2 cat name 2 3 cat name 3 现在我想显示jobs表中每个类别下的所有jobs。例如 我需要展示的内容: Job Category 1 1. job 1 from category 1 2. Job 2
job_cat_id---job_cat_name
=========================
1 cat name 1
2 cat name 2
3 cat name 3
现在我想显示jobs
表中每个类别下的所有jobs。例如
我需要展示的内容:
Job Category 1
1. job 1 from category 1
2. Job 2 from category 1
Job Category 2
1. Job 3 from category 2
为此,我使用以下sql
查询,但无法得到正确的结果:
$get_job = mysqli_query($conn, "SELECT jobs.job_id, jobs.job_title, job_category.job_cat_name FROM jobs LEFT JOIN job_category ON job_category.job_cat_id = jobs.job_cat_id WHERE jobs.is_active = '1' ");
while($result = mysqli_fetch_array($get_job) ) {
$job_id = (int) $result['job_id'];
$job_title = htmlspecialchars($result['job_title']);
$job_category = htmlspecialchars($result['job_cat_name']);
echo "<h4>$job_category</h4>";
echo "<p>$job_title</p>";
}
首先,我们必须记住,
SELECT
查询的结果是一个新生成的表。它不是多维数组。如果是多维数组,则可以在每个新数组的开头打印作业类别,该数组可以将所有作业分组到一个类别中,但是由于这不是SQLSELECT
查询获得的结果类型,因此可以在每行之后打印作业类别:
echo "<h4>$job_category</h4>";
echo "<p>$job_title</p>";
从这里,您知道每个类别中的作业至少应该相邻分组(从最低到最高,如1,1,1,2,2,3,3,3)。现在可以做的是有条件地打印$job\u类别
,前提是之前没有打印过
更改此行:
echo "<h4>$job_category</h4>";
echo“$job\u category”;
进入这一行:
if ($previous_print != $job_category)
{
echo "<h4>$job_category</h4>";
$previous_print = $job_category;
}
if($previous\u print!=$job\u category)
{
echo“$job_category”;
$previous_print=$job_category;
}
让我知道它现在是否工作。另一种解决方案可能是,您只需使用group by job cat\U id运行一个查询,然后在循环内部使用where子句job cat\U id编写另一个查询以获得所需的结果。您需要在此处执行两个查询。以下是exmaple代码,可能需要根据表列名进行一些调整:
<?php
$query = "SELECT `job_cat_id`, `job_cat_name`, COUNT(`jobs`.`id`) as `jobs`
FROM `job_category`
GROUP BY `job_cat_id`";
$get_cat = mysqli_query($conn, $query);
$cats = [];
while($result = mysqli_fetch_array($get_cat) ) {
$result['jobs'] = [];
$cats[$result['job_cat_id']] = $result;
}
$get_job = mysqli_query($conn, "SELECT jobs.job_id, jobs.job_title, jobs.job_cat_id FROM jobs WHERE jobs.is_active = '1' AND `job_cat_id` IN (" . implode(',', array_keys($cats)) . ")");
while($result = mysqli_fetch_array($get_job) ) {
$cats[$result['job_cat_id']][] = $result;
}
foreach ($cats as $cat) {
$job_category = htmlspecialchars($cat['job_cat_name']);
echo "<h4>$job_category</h4>";
foreach ($cat['jobs'] as $job) {
$job_title = htmlspecialchars($job['job_title']);
echo "<p>$job_title</p>";
}
}
只需修改两行代码即可。请查看下面我的答案,让我知道它是否适用于您。我正在检查它。我可以只使用一个查询吗?不,您应该在这里使用两个查询,因为这是一对多关系否,我可以使用一个查询来获得它。检查@Webeng答案:)这可能对3份工作有意义,但这是错误的。你不应该这样做。想象一下,当你有成百上千的工作时,会发生什么。这会是个问题吗?@shibbirahmed-awesome:)。如果这个答案对你有用,请用绿色复选标记接受它,以便将来的用户知道。
echo "<h4>$job_category</h4>";
if ($previous_print != $job_category)
{
echo "<h4>$job_category</h4>";
$previous_print = $job_category;
}
<?php
$query = "SELECT `job_cat_id`, `job_cat_name`, COUNT(`jobs`.`id`) as `jobs`
FROM `job_category`
GROUP BY `job_cat_id`";
$get_cat = mysqli_query($conn, $query);
$cats = [];
while($result = mysqli_fetch_array($get_cat) ) {
$result['jobs'] = [];
$cats[$result['job_cat_id']] = $result;
}
$get_job = mysqli_query($conn, "SELECT jobs.job_id, jobs.job_title, jobs.job_cat_id FROM jobs WHERE jobs.is_active = '1' AND `job_cat_id` IN (" . implode(',', array_keys($cats)) . ")");
while($result = mysqli_fetch_array($get_job) ) {
$cats[$result['job_cat_id']][] = $result;
}
foreach ($cats as $cat) {
$job_category = htmlspecialchars($cat['job_cat_name']);
echo "<h4>$job_category</h4>";
foreach ($cat['jobs'] as $job) {
$job_title = htmlspecialchars($job['job_title']);
echo "<p>$job_title</p>";
}
}