当前位置:网站首页>Mysql自连接查询「建议收藏」
Mysql自连接查询「建议收藏」
2022-06-28 15:50:00 【全栈程序员站长】
大家好,又见面了,我是你们的朋友全栈君。
自连接查询
假想以下场景:某一电商网站想要对站内产品做层级分类,一个类别下面有若干子类,子类下面也会有别的子类。例如数码产品这个类别下面有笔记本,台式机,智能手机等;笔记本,台式机,智能手机又可以按照品牌分类;品牌又可以按照价格分类,等等。也许这些分类会达到一个很深的层次,呈现一种树状的结构。那么这些数据要怎么在数据库中表示呢?我们可以在数据库中创建两个字段来存储id和类别名称,使用第三个字段存储类别的子类或者父类的id,最后通过自连接去查询想要的结果。
自连接查询其实等同于连接查询,需要两张表,只不过它的左表(父表)和右表(子表)都是自己。做自连接查询的时候,是自己和自己连接,分别给父表和子表取两个不同的别名,然后附上连接条件。看下面的例子:
1. 创建数据表:
create table tdb_cates(
id smallint primary key auto_increment,
cate_name varchar(20) not null,
parent_id smallint not null
);注:cate_name表示分类的名称,parent_id表示父类的id。
2. 插入数据:
insert into tdb_cates(cate_name, parent_id) values('数码产品', 0);
insert into tdb_cates(cate_name, parent_id) values('家用产品', 0);
insert into tdb_cates(cate_name, parent_id) values('笔记本', 1);
insert into tdb_cates(cate_name, parent_id) values('智能手机', 1);
insert into tdb_cates(cate_name, parent_id) values('电器', 2);
insert into tdb_cates(cate_name, parent_id) values('家具', 2);
insert into tdb_cates(cate_name, parent_id) values('冰箱', 5);
insert into tdb_cates(cate_name, parent_id) values('洗衣机', 5);
insert into tdb_cates(cate_name, parent_id) values('汽车品牌', 0);
insert into tdb_cates(cate_name, parent_id) values('别克', 9);
insert into tdb_cates(cate_name, parent_id) values('宝马', 9);
insert into tdb_cates(cate_name, parent_id) values('雪佛兰', 9);
insert into tdb_cates(cate_name, parent_id) values('家纺', 0);查询结果:
3. 查询所有分类以及分类的父类:假想有左右两张表(都是tdb_cates),左表是子表,右表是父表;查询子表的id,子表的cate_name,父表的cate_name;连接条件是子表的parent_id等于父表的id。
select s.id, s.cate_name, p.cate_name from tdb_cates s left join tdb_cates p on s.parent_id=p.id;查询结果:
4. 查询所有分类以及分类的子类:还是假想有左右两张表(都是tdb_cates),左表是子表,右表是父表;查询子表的id,子表的cate_name,父表的cate_name;连接条件是子表的id等于父表的parent_id。
select s.id, s.cate_name, p.cate_name from tdb_cates s left join tdb_cates p on p.parent_id=s.id;查询结果:
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/132874.html原文链接:https://javaforall.cn
边栏推荐
- Flutter简单实现多语言国际化
- 【Spock】处理 Non-ASCII characters in an identifier
- Geoffrey Hinton:我的五十年深度学习生涯与研究心法
- Sample explanation of batch inserting data using MySQL bulkloader
- 早晨有些犹豫
- Etcd可视化工具:Kstone简介(一)
- Operating excel with openpyxl
- Expand Disk C (allocate the memory of disk d to Disk C)
- Opengauss kernel: analysis of SQL parsing process
- 一台服务器最大并发 tcp 连接数多少?65535?
猜你喜欢

征文投稿丨使用轻量应用服务器搭建博客环境

How can the digital intelligent supply chain management platform of the smart Park optimize process management and drive the development of the park to increase speed and quality?

5分钟的时间制作一个反弹球游戏

wallys/DR7915-wifi6-MT7915-MT7975-2T2R-support-OpenWRT-802.11AX-supporting-MiniPCIe-Module

榜单首发——线控制动「新周期」,本土供应商市场竞争力TOP10

字节跳动数据平台技术揭秘:基于 ClickHouse 的复杂查询实现与优化

看界面控件DevExpress WinForms如何创建一个虚拟键盘

Opengauss kernel: analysis of SQL parsing process

wallys/DR7915-wifi6-MT7915-MT7975-2T2R-support-OpenWRT-802.11AX-supporting-MiniPCIe-Module

Technical secrets of ByteDance data platform: implementation and optimization of complex query based on Clickhouse
随机推荐
Fleet | "backstage exploration" issue 3: status management
Qt 界面库
有哪些好用的供应商管理系统
Android, eclipse and MySQL upload pictures and get
C语言基础语法
Flutter simply implements multilingual internationalization
3. Caller 服务调用 - dapr
Gartner发布当前至2024年的五大隐私趋势
关于针对tron API签名广播时使用curl的json解析问题解决方案及针对json.loads方法的问题记录
看界面控件DevExpress WinForms如何创建一个虚拟键盘
openGauss内核:SQL解析过程分析
Analysis of PostgreSQL storage structure
今天睡眠质量记录80分
【Spock】处理 Non-ASCII characters in an identifier
隐私计算 FATE - 离线预测
使用openpyxl操作Excel
REDIS00_ Explain redis Conf configuration file
零钱兑换(动态规划)
【初学者必看】vlc实现的rtsp服务器及转储H264文件
软件测试员的悲哀竟是...自己的技术能力不能满足大厂要求?