如何使用sql查询显示特定类别下的所有数据


How can I show all data under specific category using sql query?

好吧,我有2个Mysql表,其结构如下:

工作

job_id---job_cat_id---job_title---job_description---job_data----is_active
=========================================================================
1        1            title 1     description 1     2016-05-06  1
2        2            title 2     description 2     2016-05-06  0
3        2            title 3     description 3     2016-05-06  1

表格作业详细信息

job_cat_id---job_cat_name
=========================
1            cat name 1
2            cat name 2
3            cat name 3

现在,我想显示jobs表中每个类别下的所有作业。E.g

我需要显示的内容:

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>";           
}   

现在,它显示了所有工作的所有类别,但我想显示每个类别下的所有工作。

现在显示的内容:

Job Category 1
    1. job 1 from category 1        
Job Category 1
    1. Job 2 from category 1
Job Category 2
    1. Job 3 from category 2

首先我们必须记住,SELECT查询的结果是一个新生成的表。它不是多维数组。如果它是一个多维数组,那么您可以在每个新数组的开头打印作业类别,该数组可以将所有作业分组到一个类别中,但由于这不是SQL SELECT QUERY获得的结果类型,因此您将在每行之后打印作业类别:

echo "<h4>$job_category</h4>";  
echo "<p>$job_title</p>";     

解决方案:

解决问题的方法是首先在sql查询中使用ORBER BY ASC

$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' ORDER BY job_cat_id ASC");

从那里,你知道每个类别中的工作至少应该相邻分组(从最低到最高,如1,1,1,1,2,3,3)。现在你可以做的是有条件地打印$job_category,如果AND ONLY,如果它以前还没有打印过。

更改此行:

echo "<h4>$job_category</h4>";

进入这一行:

if ($previous_print != $job_category)
{
  echo "<h4>$job_category</h4>";  
  $previous_print = $job_category;
}

让我知道它现在是否有效。

另一种解决方案可能是,如果您只使用group-by-job_cat_id运行一个查询,然后在循环内使用where子句job_cat_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>";
    }
}