共计 2050 个字符,预计需要花费 6 分钟才能阅读完成。
自动写代码机器人,免费开通
mysql 中如何使用左链接查询,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。
我这里所说的主表是指在连接查询里 MySQL 以哪个表为主进行查询。比如说在 MySQL 左连接查询里,一般来说左表就是主表,但这只是经验之谈,很多时候经验主义是靠不住的,为了说明问题,先来个例子,建两个演示用的表 categories 和 posts:
CREATE TABLE IF NOT EXISTS `categories` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, `name` varchar(15) NOT NULL, `created` datetime NOT NULL, PRIMARY KEY (`id`), KEY `name` (`name`) ); CREATE TABLE IF NOT EXISTS `posts` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, `category_id` int(10) unsigned NOT NULL, `title` varchar(100) NOT NULL, `content` varchar(200) NOT NULL, `created` datetime NOT NULL, PRIMARY KEY (`id`), KEY `category_id` (`category_id`), KEY `created` (`created`), KEY `category_id_created` (`category_id`, `created`) );
先注意一下每个表的索引情况,以后会用到,记得随便插入一点测试数据,不用太多,但怎么也得两行以上,然后执行以下
SQL: EXPLAIN SELECT * FROM posts LEFT JOIN categories ON posts.category_id = categories.id WHERE categories.name LIKE foobar% ORDER BY posts.created DESC
结果如下所示:
table key Extra categories name Using where; Using temporary; Using filesort posts category_id
在 join 查询的 explain 的结果中,第一行表示的表就是主表。所以说在此查询里 categories 是主表,而在我们的经验里,LEFT JOIN 查询里,左表 (posts 表) 才应该是主表,这产生一个根本的矛盾,MySQL 之所以这样处理,是因为在我们的 WHERE 部分,查询条件是按照 categories 表的字段来进行筛选的,且 categories 表刚好存在合适的索引,所以在查询时把 categories 表作为主表更有利于缩小结果集。
那 explain 结果中的 Using temporary; Using filesort 又是为什么呢,为什么 created 或 category_id_created 索引无效呢? 这是因为主表是 categories 表,从表是 posts 表,而我们使用从表的字段去 ORDER BY,这通常不是一个好选择,最好改成主表字段。不过很多时候改不了,那就没招了。
再看一个比较怪异的例子:
EXPLAIN SELECT * FROM posts LEFT JOIN categories ON posts.category_id = categories.id WHERE categories.id = lsquo; 一个已经存在的 ID rsquo; ORDER BY posts.created DESC
这个例子里 posts 表仍然是从表,但是按照从表排序的结果却没有出现文件排序和临时表,这是因为已经确定了 categories.id,所以主表相当于一个只有一行数据的常量表了,从表根据 category_id_created 索引在连接的同时自然就得到排序后的结果。但换个角度看,既然 categories.id 都是确定的了,那类似这样的需求,我们一般就不会再使用 LEFT JOIN 查询了,而会分成两个独立的查询去检索 categories 和 posts 才对。
主观上一旦搞错了主表,可能怎么调整索引都得不到高效的 SQL,所以在写 SQL 时,比如说在写 MySQL 左连接查询时,如果希望左表是主表,那么就要保证在 WHERE 语句里的查询条件尽可能多的使用左表字段,进而,一旦确定了主表,也最好只通过主表字段去 ORDER BY。
关于 mysql 中如何使用左链接查询问题的解答就分享到这里了,希望以上内容可以对大家有一定的帮助,如果你还有很多疑惑没有解开,可以关注丸趣 TV 行业资讯频道了解更多相关知识。
向 AI 问一下细节