很多应用场景,为了降低数据冗余,往往把数据拆解成多个表存储,表与表之间通过外键建立关联。基于这场景我们会用到链表查询获取数据。
链表方式:
- left join:左链,先获取左表满足筛选条件的数据,再获取左表与右表等值的右表数据,即使左表中存在不与右表匹配的数据也被获取。
- inner join:内链,俗称等值查询。左表与右表存在匹配的数据将被筛选出来。即两表的交集。
- right join:右链,与左链相反。先获取右表满足筛选条件的数据,再获取右表与左表等值的左表数据,即使右表中存在不与左表匹配的数据也被获取。
场景:有演员(演员名字、演员描述)、电影(电影名字、电影类型、电影描述)等信息,需要获取xxx演员参与的电影详细信息。演员可以饰演多部电影,电影可由多名演员饰演。
表设计
电影表:
CREATE TABLE `movie` (
`m_id` int(10) unsigned NOT NULL COMMENT '电影id',
`m_name` varchar(20) NOT NULL DEFAULT '' COMMENT '电影名称',
`m_type` tinyint(4) unsigned NOT NULL DEFAULT '0' COMMENT '电影类型',
`m_desc` varchar(10) NOT NULL DEFAULT '' COMMENT '电影描述',
PRIMARY KEY (`m_id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COMMENT='电影表'
演员表:
CREATE TABLE `user` (
`u_id` int(10) unsigned NOT NULL COMMENT '演员id',
`u_name` varchar(20) NOT NULL DEFAULT '' COMMENT '演员名称',
`m_desc` varchar(10) NOT NULL DEFAULT '' COMMENT '演员描述',
PRIMARY KEY (`u_id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COMMENT='演员表'
演员参演电影信息:
CREATE TABLE `user_movie` (
`um_id` int(10) unsigned NOT NULL COMMENT '参演id',
`u_id` int(10) unsigned NOT NULL COMMENT '演员id',
`m_id` int(10) unsigned NOT NULL COMMENT '电影id',
PRIMARY KEY (`um_id`),
INDEX um_id(`u_id`,`m_id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COMMENT='演员参演的电影表'
Sql 实现:
select * from user u left join user_movie um on u.u_id=um.u_id left join movie m on um.m_id=m.m_id where u.u_name='xxx';