MySQL在字段中使用select子查询

来源:互联网 发布:北京知金教育可靠吗 编辑:程序博客网 时间:2024/05/29 06:59

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

大概的形式是这样的:

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

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

商品表:

[sql] view plain copy
  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;  

评论表:

[sql] view plain copy
  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;  

然后插入一些数据:

[sql] view plain copy
  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, '很实用哦');  

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

[sql] view plain copy
  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子查询只能查询一个字段。

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

[sql] view plain copy
  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