php mysql pdo-菜单的类别和子类别项

php mysql pdo-菜单的类别和子类别项,php,mysql,multidimensional-array,Php,Mysql,Multidimensional Array,我有两个数据库表,类别和子类别,带有以下字段: category table - category_id, category_name, status subcategory table - subcategory_id, subcategory_name, category_id, status 子类别.category\u id与类别.category\u id 我需要创建一个包含类别和子类别项的菜单。仅显示那些项目,其中category.status和subcategory

我有两个数据库表,类别和子类别,带有以下字段:

category table     -  category_id, category_name, status
subcategory table  -  subcategory_id, subcategory_name, category_id, status
子类别.category\u id
类别.category\u id

我需要创建一个包含类别和子类别项的菜单。仅显示那些项目,其中category.status和subcategory.status=“Enabled”。

这是我的sql查询:

SELECT DISTINCT *
FROM category C LEFT OUTER JOIN subcategory S
ON C.category_id = S.category_id AND S.status = 'Enabled'
WHERE C.status = 'Enabled'
例如:

服装:(类别)

流动的 (无子类别)

我需要显示所有类别,无论它是否有子类别。只有两个表中状态为“已启用”的表才需要显示

我的问题是:

对于没有子类别项的第二个类别,我没有得到category_id值,如以下示例所示:

1男装

1 Jackets

2 Sweaters
计算机

对于男装类别I,id为1;对于子类别夹克,id为1;对于子类别毛衣,id为2

没有没有子类别项的第二类“计算机”的id

我的sql语句有什么问题?我无法理解

问题已解决:

此问题的原因如下:

如果执行外部左联接并将PDO FetchALL设置为PDO::FETCH_ASSOC,则如果联接中未返回任何记录,则在外部左联接中使用的任何主键都将设置为空白

修正:

解决方法是在SELECT子句中简单地指定字段名,而不是使用*作为通配符,或者,除了*之外,还可以指定字段

在我的sql中:

选择DISTINCT*,C.category\u id

您的左连接不会返回不匹配的值,因为您在其中有
S.status='enabled'
术语。如果要返回“没有子类别的类别”项,则应将此术语移动到“where”部分,并将其设置为可选项(即和(s.status=enabled或isnull(s.status))

“我的查询是否正确以获得所需的输出?”
-运行查询并找出答案。是否获得预期的输出?
“我如何继续”
-通过继续开发代码?你被困在哪里?为什么没有子类别的第二个类别缺少类别id?我的sql查询是否正确?还是与pdo有关?Mysql workbench提供了包括类别id和其他值的行为空。”DISTINCT*“几乎没有什么意义。除了第二个类别的类别id没有子类别之外,它返回的值是正确的。我已经尝试过了:其中C.status='Enabled'和S.status='Enabled'或S.status为空,那么,如果我禁用所有子类别,类别将不会显示为不满足条件(S.status为'Enabled'或S.category为NULL….在Mysql workbench上完成的查询将生成id正确的结果..在php中,该结果显示不正确。要在联接中进行比较,需要使用()。
将它们分组,其中c=''和(S=''或isnull)
否则比较不准确。请提供一个示例。请参阅我刚刚发布的与php代码一起发布的print\r的更新数组输出。该数组不显示没有子类别的第二类计算机的类别id。Mysql query run提供3行正确输出,包括Mysq上所有记录的类别idl工作台。问题已解决,并在我的回答中更新了修复程序…这让我发疯:)
1 Jackets

2 Sweaters