Php通过mysql查询按类别id获取子类别

时间:2017-12-10 19:33:56

标签: php mysql

这是我的数据库结构

Categories table
id    title
-----------
1     cars
2     city
3     names
------------
subcategory table
id    cat_id    title
1     1         BMW
2     1         Kia
3     2         Moscow
4     1         Passat
5     2         London
6     3         John
----------------------

现在我正在使用这样的foreach获取类别和打印:

$myquery = query("Select * From categories"); // These functions only for example

$array = mysql_fetch_array($myquery); // These functions only for example

foreach($array as $cat){

    echo $cat['title'];
    echo "<br />";

    // in here must be again foreach or other loop to print subcats belongs to
    // this category id, otuput like this:
    // Cars 
    // -- BMW
    // -- KIA
    // -- Passat
    // City
    // -- Moscow and etc...

}

我不想在foreach中使用新查询,我想用mysql JOIN做这个,但我不知道怎么做。谁能帮帮我?

2 个答案:

答案 0 :(得分:1)

mysql连接将是:

SELECT subcategory.*, categories.title as cat_title FROM subcategory JOIN categories ON subcategory.cat_id = categories.id ORDER BY subcategory.cat_id;

这将为您提供一个表格,其中包含具有其他类别信息的所有子类别项目

php看起来像这样:

$result = mysql_fetch_array($myquery);
foreach($result as $row){
    // this is the category name
    print($row['cat_title']);
    // the title of the subcategory item
    print($row['title']);
}

如果您不希望每次签出this时都打印类别名称,请发布如何按一个列排序表格。将数组更改为多维数组,以便您可以使用两个foreach。那么Php会是这样的:

$categories = array();
// result comes from the SELECT
foreach($result as $row){
    if(isset($row['cat_title']) && !empty($row['cat_title'])){
        if(!isset($categories[$row['cat_title']]) || !is_array($categories[$row['cat_title']])){
            $categories[$row['cat_title']] = array();
        }

        array_push($categories[$row['cat_title']], $row);
    }
}

现在,您可以使用foreach查看类别:

foreach($categories as $category => $items){
    print($category);
    foreach($items as $item){
        print("\t".$item);
    }
}

答案 1 :(得分:0)

对于你的任务可能是一个很好的解决方案是两个查询,一个用于所有类别,一个用于所有具有联接猫(或没有)的子类别。

所有猫的第一个循环和第二个循环用于此猫的子序列。

foreach ($cats as  $category) {
  echo $category['title'];
  foreach ($subcats as $subcat) {
    if ($subcat['cat_id'] !== $cat['id']) {continue;}
    echo '--'.$subcat['title']
  }
}

另一个带有一个查询的变体是带有已打印类别的附加数组,如

<强> SQL:     正如@ miile7和bradbury9提供订单

SELECT subcategory.*, categories.title as cat_title FROM subcategory JOIN categories ON subcategory.cat_id = categories.id ORDER BY subcategory.cat_id;

<强> PHP:

$printedIds = [];
foreach ($subcats as  $subcat) {
  if (!in_array($subcat['cat_id'] ,$printedIds)) {
    $printedIds []= $subcat['cat_id'];
    echo $category['title'];
  }

  echo '--'.$subcat['title'];
}

P.S。它的好主意是以一种风格命名表:全部为复数或全部为单一。