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

shi*_*med 5 php mysql sql

好吧,我有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
Run Code Online (Sandbox Code Playgroud)

表job_details

job_cat_id---job_cat_name
=========================
1            cat name 1
2            cat name 2
3            cat name 3
Run Code Online (Sandbox Code Playgroud)

现在我想从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
Run Code Online (Sandbox Code Playgroud)

所以要做到这一点,我使用以下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>";           
}   
Run Code Online (Sandbox Code Playgroud)

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

现在在演什么 :

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
Run Code Online (Sandbox Code Playgroud)

Web*_*eng 2

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

echo "<h4>$job_category</h4>";  
echo "<p>$job_title</p>";     
Run Code Online (Sandbox Code Playgroud)

解决方案:

解决您的问题的方法是首先ORBER BY ASC在您的 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' ORDER BY job_cat_id ASC");
Run Code Online (Sandbox Code Playgroud)

从那里,您知道每个类别中的工作至少应该彼此相邻分组(从最低到最高,如 1,1,1,1,2,2,3,3,3)。您现在可以做的是有条件打印$job_categoryif AND ONLY IF 之前尚未打印过。

更改这一行:

echo "<h4>$job_category</h4>";
Run Code Online (Sandbox Code Playgroud)

进入这一行:

if ($previous_print != $job_category)
{
  echo "<h4>$job_category</h4>";  
  $previous_print = $job_category;
}
Run Code Online (Sandbox Code Playgroud)

让我知道现在是否有效。