我有一张表,其中列出了类别,每个产品都可以属于或不属于父类别。只有一层可能的深度。
CREATE TABLE `categories` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`name` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
`parent` int(10) unsigned DEFAULT NULL,
PRIMARY KEY (`id`)
);
然后我插入一些记录:
INSERT INTO `categories` (`id`, `name`, `parent`) VALUES
(1, 'Cat 1', NULL),
(2, 'Cat 2', NULL),
(3, 'Cat 3', NULL),
(4, 'Subcat 2.1', 2),
(5, 'Subcat 2.2', 2);
现在我想得到一个列表,其中包括所有类别和子类别,按主类别和下面的子类别排序,如下所示:
Cat 1
Cat 2
Subcat 2.1
Subcat 2.2
Cat 3
当我尝试以下它几乎可以工作,但它不会返回“Cat 2”的记录,只有孩子。
SELECT e.name AS parent_name, e.id AS parent_id, r.id AS child_id, r.name AS child_name
FROM categories e
LEFT JOIN categories r ON e.id = r.parent
WHERE e.parent IS NULL
ORDER BY parent_name, child_name
结果:
Cat 1 1 NULL NULL
Cat 2 2 4 Subcat 2.1
Cat 2 2 5 Subcat 2.2
Cat 3 3 NULL NULL
如何让它返回所有 5 条记录,包括“Cat 2”父类别?
连接应该在相反的方向并且没有
WHERE
. 将其视为从任何类别 (r
) 开始。它们都具有parent
(因此会出现 parent_name 和 parent_id)或不具有(因此这些列将具有NULL
):