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 加入同一张表的主要内容,如果未能解决你的问题,请参考以下文章

SQL select同一张表,两个不同的顺序

避免多次加入同一张表

如何从同一张表中优化几个“WHERE(Select ....)= value”

同一张表上的两个“SELECT FOR UPDATE”语句会导致死锁吗?

同一张表省市县sql查询

OpenJPA/MySQL:在 where 子句中使用同一张表时修改表