MySQL在字段中使用select子查询

前几天看别人的代码中看到在字段中使用select子查询的方法,第一次见这种写法,然后研究了一下,记录下来

大概的形式是这样的:

select a .*,(select b.another_field from b where a.id=b.aid) another_field from a where 1 limit 10;

下面还是以实例来说明,要不然不好理解,新建两张表,一张是商品表,另外一张是商品的评论表

商品表:

  1. CREATE TABLE `product` (  
  2.  `id` int(11) NOT NULL AUTO_INCREMENT,  
  3.  `product_name` varchar(30) CHARACTER SET utf8 NOT NULL,  
  4.  `price` float NOT NULL,  
  5.  PRIMARY KEY (`id`)  
  6. ) ENGINE=InnoDB;

评论表:

  1. CREATE TABLE `comment` (  
  2.  `id` int(11) NOT NULL AUTO_INCREMENT,  
  3.  `entity_id` int(11) NOT NULL,  
  4.  `content` varchar(100) CHARACTER SET utf8 NOT NULL,  
  5.  PRIMARY KEY (`id`)  
  6. ) ENGINE=InnoDB;

然后插入一些数据:

  1. INSERT INTO `product` (`id`, `product_name`, `price`) VALUES  
  2. (1, '肉松饼', 5),  
  3. (2, '可乐', 5),  
  4. (3, '鸡翅', 12),  
  5. (4, '杯子', 42);  
  6. INSERT INTO `comment` (`id`, `entity_id`, `content`) VALUES  
  7. (1, 1, '味道还不错'),  
  8. (2, 1, '还行啊'),  
  9. (3, 3, '很实用哦');  

下面我们用子查询的方式来查出商品的信息以及每个商品的评论数量

  1. SELECT product.*,(select count(comment.id) from comment where product.id=comment.entity_id) comment_count FROM `product` limit 5;  

查询结果如下:

id product_name price comment_count

1 肉松饼 5 2

2 可乐 5 0

3 鸡翅 12 1

4 杯子 42 0

对于这种查询,可以分成两部来理解,首先忽略整个select子查询,查出商品表中的数据,然后根据商品的id执行子查询,对于一个商品id,子查询只能返回一条数据,如果子查询返回多条数据则会出错,另外,每一条select子查询只能查询一个字段。

另外的列子,查出每个商品信息以及商品的最新评论内容:

  1. SELECT product.*,(select comment.content from comment where product.id=comment.entity_id order by comment.id desc limit 1) comment_count FROM `product` limit 5;  

查询结果如下:

id product_name price last_comment

1 肉松饼 5 还行啊

2 可乐 5 NULL

3 鸡翅 12 很实用哦

4 杯子 42 NULL

 

还有个项目例子

商品列表里展示出一级和二级分类的名称,但是商品表里只存入二级分类的ID,此时通过一条sql语句将结果查询出来,

商品表(cbti_goods) 商品分类表(cbti_goods_class) 商品表的二级分类字段:idSubGoodsClass 商品分类表的ID字段idGoodsClass

sql:

select a.*,b.`chName`,b.`parentId`,b.`idGoodsClass`
,(select chName as pname from cbti_goods_class where idGoodsClass=b.parentId) as pname from `cbti_goods` a left join `cbti_goods_class` b on a.`idSubGoodsClass` = b.`idGoodsClass`
截图如下
继续阅读
weinxin
我的微信公众号
扫一扫获取最新动态
  • 文本由 发表于 2018年5月31日04:55:00
  • 除非特殊声明,本站文章均为原创,转载请务必保留本文链接
0基础30天精通网站建设,月入6000元起 杂谈

0基础30天精通网站建设,月入6000元起

读完本篇,将教给你月收入6000元的能力,这里将要介绍一套技术实操型课程,同时会免费送每位读者一个价值12000元的课程。这是一门真正的技术,是所有网络项目的基础,是网“贝兼”的必备技能,也是目前市场...
MySQL实战篇:建立高性能的MySQL技巧 杂谈

MySQL实战篇:建立高性能的MySQL技巧

前言 MySQL是一种关系数据库管理系统,关系数据库将数据保存在不同的表中,而不是将所有数据放在一个大仓库内,这样就增加了速度并提高了灵活性。由于其体积小、速度快、总体拥有成本低,尤其是开放源码这一特...
MySQL进阶:从小工到专家的必读书籍 杂谈

MySQL进阶:从小工到专家的必读书籍

各大论坛上总是有很多同学咨询学习MySQL有哪些书,或者是入行DBA要做哪些准备。今天就和大家分享下想学习MySQL可以选择哪些书籍。 数据是Web应用程序最重要的部分。随着互联网和高端Web应用程序...