Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/58.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php MySQL计数子元素_Php_Mysql_Adjacency List - Fatal编程技术网

Php MySQL计数子元素

Php MySQL计数子元素,php,mysql,adjacency-list,Php,Mysql,Adjacency List,我有一个分类表: id | name | parent_id 1 | Camaro | 0 2 | Chevelle | 0 3 | Sale - Camaro Parts | 1 4 | Bestselling Parts | 1 我的第一个请求如下: 'SELECT * FROM `categories` WHERE parent_id = :parent_id'; 在获取结果集之后,我进行子查询以检查行是否有子元素: foreach($res

我有一个分类表:

id | name |  parent_id
1  | Camaro | 0
2  | Chevelle | 0
3  | Sale - Camaro Parts | 1
4  | Bestselling Parts | 1
我的第一个请求如下:

'SELECT 
    * 
 FROM 
    `categories`
 WHERE
    parent_id = :parent_id';
在获取结果集之后,我进行子查询以检查行是否有子元素:

foreach($result as $r) {
    $r->hasChild    = count(ORM::forTable('categories')->where('parent_id', $r->id)->findArray());
    $data[]         = $r;
}
是否有任何方法可以避免在foreach循环中多次连接到DB,并在第一次查询中获取数据


谢谢

您可以在parent_id和id上对表进行自联接。根据您是否希望类别包含子类别,您可以进行左联接或内部联接。这里也提到了类似的问题-

这并不可怕,只要您只希望所选行下面的子行数。如果需要整个层次结构,则需要使用更好的RDMS

这里解决方案的主要部分是自连接同一个表。然后,我们可以使用
count()
aggregate函数查看每个项附加了多少子项

选择
类别.id
,categories.name
,categories.parent\u id
,计数(chld.id)
从…起
类别
左连接类别chld
关于categories.id=chld.parent\u id
哪里
父\u id=:父\u id
分组
类别.id
,categories.name
,categories.parent\u id

categories`中选择count(*),其中parent\u id=:parent\u id`感谢但如何左键连接呢?可能是重复的