【问题标题】:Php get subcategories by category id with mysql queryphp通过mysql查询按类别id获取子类别
【发布时间】:2017-12-10 19:33:55
【问题描述】:

这是我的数据库结构

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 来执行此操作,但我不知道如何操作。谁能帮帮我?

【问题讨论】:

  • 创建join语句并按category.id排序,然后在循环中检查你是否已经拥有那个即将到来的类别->只打印子类别。如果您还没有主要类别,也请打印出来。
  • 或者你先把它全部放在一个二维数组中(以 category.id 作为主键)。

标签: php mysql


【解决方案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);
    }
}

【讨论】:

  • 我如何分别回显类别和子目录标题,你能显示吗?
  • 分类表没有cat_id列是不是你写错了?
  • 这个解决方案所有的猫都会被打印 cabcategory count 次。
  • 添加了php代码,SELECT也有2个错误,你的表叫“categories”,我写错了。还有两个“标题”列,为了访问它们我重命名了另一个表
  • 您应该在 select 语句中添加一个 order by 以简化操作
【解决方案2】:

对于您的任务,一个好的解决方案可能是两个查询,一个用于所有类别,一个用于所有包含(或不包含)猫的子类别。

所有猫的第一个循环和这只猫中子猫的第二个循环。

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'];
}

附:用一种风格命名表格是个好主意:全部以复数形式或全部以单一形式。

【讨论】:

    猜你喜欢
    • 2020-12-06
    • 2012-02-20
    • 1970-01-01
    • 2017-04-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多