我有2个数据库表,类别和子类别与以下字段:
category table - category_id, category_name, status
subcategory table - subcategory_id, subcategory_name, category_id, status
subcategory.category_id
与category.category_id
相关
我需要创建一个具有类别和子类别项的菜单。where category.status and subcategory.status = "Enabled".
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'
例如:服装(类别):
Mens Wear (subcategory)
Laddies Wear (subcategory
移动(没有子类)
我需要显示所有类别,不管它是否有子类别。只有在两个表中状态为"Enabled"的才需要显示。
我的问题是:
对于没有子类别项的第二个类别,我没有得到category_id值,如以下示例:
1男士着装
1 Jackets
2 Sweaters
电脑对于男士服装类别,我的id为1,对于子类别,夹克的子类别id为1,毛衣的子类别id为2。
第二个类别"Computers"没有id,没有子类别项目。
我的sql语句有什么问题?我无法理解。
问题解决:
这个问题是由于以下原因:
如果你执行一个OUTER LEFT JOIN并将PDO FetchALL设置为PDO::FETCH_ASSOC,如果在JOIN中没有返回记录,那么你在OUTER LEFT JOIN中使用的任何主键都将被设置为空白。
修复:
修复方法是简单地在SELECT子句中指定字段名,而不是使用*作为通配符,或者,您也可以在*之外指定字段。
In my sql:
SELECT DISTINCT *, C.category_id
您的左连接将不会返回不匹配的值,因为您有S.status = 'enabled'
项在那里。如果你想返回"没有子类别的类别"项目,你应该将这个术语移动到"where"部分,并使其成为可选的(IE '和(s.status = enabled OR isnull(s.status))