mysql - 如何按类型选择子类别和父类别
问题描述
如何选择 type = 1 的子类别和父类别?
例如:
电视(类型 = 0)-> LED(类型 = 1)-> QLED(类型 = 1)-> 32inc(类型 = 0)
电视(类型 = 0)-> LED(类型 = 1)-> QLED(类型 = 1)-> 24inc(类型 = 1)
电话(类型 = 1)-> LG(类型 = 1)-> A100(类型 = 1)
电话(类型 = 1)-> LG(类型 = 1)-> C300(类型 = 1)
我希望得到类似的结果
LED -> QLED
LED -> QLED -> 24inc
手机 -> LG -> A100
手机 -> LG -> C300
如果父/子不是 type = 1,则返回结果中不应存在,但如果 type = 1,则其子应存在于结果中
CREATE TABLE `menu` (
`id` int(11) NOT NULL,
`name` varchar(255) NOT NULL,
`main_cat` int(11) NOT NULL,
`room` int(11) NOT NULL COMMENT ' 0 = False, 1 = True',
`type` int(11) NOT NULL COMMENT ' 0 = False, 1 = True',
`sort_order` int(11) NOT NULL
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
INSERT INTO `menu` (`id`, `name`, `main_cat`, `room`, `type`, `sort_order`) VALUES
(21, 'TV', 0, 1, 0, 1),
(22, 'LED', 21, 0, 1, 1),
(23, 'QLED', 21, 0, 1, 0),
(24, '24inc', 23, 0, 1, 0),
(25, '32inc', 23, 1, 0, 0),
(26, 'Phone', 0, 0, 1, 2),
(27, 'LG', 26, 0, 1, 2),
(28, 'A100', 27, 0, 1, 1),
(29, 'C300', 27, 0, 1, 1),
(55, 'PC', 0, 1, 1, 3),
(56, 'HP', 55, 0, 1, 2);
ALTER TABLE `menu`
ADD PRIMARY KEY (`id`);
SELECT
m1.id AS main_id, m1.name AS main_name,
m2.id AS sub_id, m2.name AS sub_name,
m3.id AS subsub_id, m3.name AS susub_name
FROM menu m1
LEFT JOIN menu m2 ON m2.main_cat = m1.id
LEFT JOIN menu m3 ON m3.main_cat = m2.id
WHERE m1.main_cat = 0
解决方案
只需在内部 SQL 中添加 where 子句:
SELECT
m1.id AS main_id, m1.name AS main_name,
m2.id AS sub_id, m2.name AS sub_name,
m3.id AS subsub_id, m3.name AS susub_name
FROM menu m1
LEFT JOIN (SELECT * FROM menu where type=1) m2 ON m2.main_cat = m1.id
LEFT JOIN (SELECT * FROM menu where type=1) m3 ON m3.main_cat = m2.id
WHERE m1.main_cat = 0
或者如果我仔细理解的话使用我的方法
SELECT * FROM (
SELECT m1.name as name1, m2.name as name2 FROM menu m1
LEFT JOIN menu m2
on m1.id = m2.main_cat
where m2.type = 1
) A
left join (
SELECT m1.name as name1, m2.name as name2 FROM menu m1
LEFT JOIN menu m2
on m1.id = m2.main_cat
where m2.type = 1
) B
on A.name2 = b.name1
或者以更好的方式使用临时表
CREATE TEMPORARY TABLE tmpTable SELECT m1.name as name1, m2.name as name2 FROM menu m1
LEFT JOIN menu m2
on m1.id = m2.main_cat
where m2.type = 1;
SELECT A.name1, A.name2,B.name2 FROM tmpTable A
left join tmpTable B
on A.name2 = b.name1
编辑=================== 为行添加类型限定符:
SELECT A.name1, A.name2, B.name2 FROM (
SELECT m1.name as name1, m2.name as name2 FROM menu m1
LEFT JOIN menu m2
on m1.id = m2.main_cat
where m1.type = 1 and m2.type = 1
) A
left join (
SELECT m1.name as name1, m2.name as name2 FROM menu m1
LEFT JOIN menu m2
on m1.id = m2.main_cat
) B
on A.name2 = b.name1
推荐阅读
- html - div底部带有三角形的多个框
- sass - ::ng-deep angular 6 style pierce ngx-chips 标签输入组件
- asp.net-web-api - 增加 Owin 主机的最大标头大小
- bash - Shell 脚本 - 数组迭代无法正常工作 - 嵌套 for 循环
- javascript - 通过下拉列表和用户输入和 javascript 将英制值转换为公制
- powershell - 使用 Try/Catch 将用户移动到云中的 Exchange
- python - 如何在此 python 代码中提供图像的路径?
- javascript - nodejs:http内容未完全传输
- vue.js - 为什么组件在 v-if 下没有被销毁
- c++11 - 注释掉`move constructor`和`move assignment operator`会导致编译错误