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`
截图如下

原文地址:https://www.cnblogs.com/YangJieCheng/p/7146890.html