MYSQL SELECT 加入同一张表
Posted
技术标签:
【中文标题】MYSQL SELECT 加入同一张表【英文标题】:MYSQL SELECT Join on the same table 【发布时间】:2020-07-30 19:05:54 【问题描述】:我的 mysql 数据库中有这个表:
CREATE TABLE `Category` (
`category_id` int(11) NOT NULL,
`title` varchar(20) COLLATE utf8_bin NOT NULL,
`parent_id` int(11) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin;
parent_id
符合表的category_id
(递归):
category_id title parent_id
1 David 0
2 Lenny 1
3 Tom 1
4 John 3
5 Donald 4
6 Kelly 2
我想在表格上进行选择,但要获得 parent_id 作为标题,可以像这样进行 Join SELECT 吗?它不会造成任何缓慢的问题吗?
【问题讨论】:
您应该能够以与使用 2 个不同的表相同的方式执行此操作,只需使用表的自定义名称来了解在选择中引用的内容,例如从类别 A 中选择 a.title 在 A.category_id = B.parent.Id 上加入类别 B。不应该有任何缓慢的问题,但您可能想要使用索引(category_id 的主键和 parent_id 的外键) 【参考方案1】:您可以将表连接到自身。这是您可以使用的查询;您可能需要稍微修改它以获得您想要的确切列。
select
child.title `child`,
parent.title `parent`
from
Category `child`
join Category `parent` on `child`.parent_id = `parent`.category_id
;
该查询将返回以下结果:
child parent
--------------
Lenny David
Tom David
John Tom
Donald John
Kelly Lenny
这是一个你可以玩的 SQL Fiddle:http://sqlfiddle.com/#!9/a254cb/3
编辑:如果您关心没有父母的大卫,这是一个带有左连接的版本:http://sqlfiddle.com/#!9/a254cb/4
编辑:不,对于像这样具有简单连接的小表,没有性能问题。
【讨论】:
您松开了 id=1 的行。使用 LEFT 连接和 COALESCE()。 OP 没有具体说明大卫是否重要,因为他没有父母。但是,是的,左连接可以解决这个问题。更新了答案以包含左连接示例 (sqlfiddle.com/#!9/a254cb/4)。如果需要让 MySQL 显示非空值,例如“No parent”,可以添加合并。 OP 没有说明 David 是否重要,因为他没有父母主要是他没有指定必须跳过根行。 @Jon 谢谢,第二个选项是我需要的,因为我想获取所有数据以上是关于MYSQL SELECT 加入同一张表的主要内容,如果未能解决你的问题,请参考以下文章
如何从同一张表中优化几个“WHERE(Select ....)= value”