前几天看别人的代码中看到在字段中使用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`
截图如下

MySQL在字段中使用select子查询的更多相关文章

  1. mysql: update字段中带select

    update字段中带select UPDATE tb_report_type A INNER JOIN (SELECT LEVEL_CODE FROM tb_report_type WHERE id ...

  2. SELECT中常用的子查询操作

    MySQL中的子查询 是在MySQL中经常使用到的一个操作,不仅仅是用在DQL语句中,在DDL语句.DML语句中也都会常用到子查询. 子查询的定义: 子查询是将一个查询语句嵌套在另一个查询语句中: 在 ...

  3. 警惕 MySql 更新 sql 的 WHERE 从句中的 IN() 子查询时出现的性能陷阱

    警惕 MySql 更新 sql 的 WHERE 从句中的 IN() 子查询时出现的性能陷阱 以下文章来源:https://blog.csdn.net/defonds/article/details/4 ...

  4. 警惕 MySql 更新 sql 的 WHERE 从句中的 IN() 子查询时出现的陷阱

    mer_stage 表有 216423 条记录,DDL: CREATE TABLE `mer_stage` ( `STAGE_ID` int(11) NOT NULL AUTO_INCREMENT, ...

  5. SELECT列表中的标量子查询

    发现了一种表连接新的写法,以前还没有这样写过或者见别人写过.跟同学聊天他们公司却很多人这样写,看来真的要学学sql了 表 CREATE TABLE `t_book` ( `FId` ) NOT NUL ...

  6. MySQL select 子查询的使用

    ### 子查询 >where 这个值是计算出来的 >本质:`在 where 语句中嵌套一个子查询语句` ```sql /*============== 子查询 ============== ...

  7. mysql中not in子查询不能为空

    转载自:https://blog.csdn.net/headingalong/article/details/77744755 错误sql delete from company_info where ...

  8. MySQL学习笔记(五)—— 子查询及联结

    子查询: 子查询,即嵌套在其他查询中的查询.例如我们有这样几个表,顾客表,订单表,商品表,我们想知道有哪些客户买了商品A,那么我们就需要先查看哪些订单里包含了商品A,然后根据订单查出是哪些客户. my ...

  9. MySQL(18):Select- subquery子查询

    1. Select- subquery子查询 子查询:是将一条查询语句嵌套在另一条查询语句之中. 2. 案例 需求:查询获得代课天数最多的那个老师的信息. 思路:先获得最多的代课天数是多少天,然后再判 ...

随机推荐

  1. Java数据结构和算法(三)——冒泡、选择、插入排序算法

    上一篇博客我们实现的数组结构是无序的,也就是纯粹按照插入顺序进行排列,那么如何进行元素排序,本篇博客我们介绍几种简单的排序算法. 1.冒泡排序 这个名词的由来很好理解,一般河水中的冒泡,水底刚冒出来的 ...

  2. linux正确的关机方法

    [root@localhost ~]# sync #数据写入磁盘 [root@localhost ~]# shutdown -h 10 #通知用户再过10分钟就关机 [root@localhost ~ ...

  3. JSP7(Cookie与javamail)

    一.cookie是什么意思? 英文直接翻译过来的意思呢就是小甜品 Cookie英文意指饼干,不过在电脑术语中它可不像饼干那么简单.简单的说,Cookie就是服务器暂存放在你计算机上的一笔资料,好让服务 ...

  4. hibernate第一天

    首先介绍一下javaEE开发的三层架构 Web层    也被称为表现层    它是表现层的一个设计模型:也就是大家常用的MVC开发模式 Service层   它是和需求相关的 DAO层   它只和数据 ...

  5. Android 异步消息处理机制终结篇 :深入理解 Looper、Handler、Message、MessageQueue四者关系

    版权声明:本文出自汪磊的博客,转载请务必注明出处. 一.概述 我们知道更新UI操作我们需要在UI线程中操作,如果在子线程中更新UI会发生异常可能导致崩溃,但是在UI线程中进行耗时操作又会导致ANR,这 ...

  6. 【垃圾回收】Java内存回收实践经验 防止内存报警

    jdk6和7服务器端(-server) 默认的新生代的垃圾回收器为:PS Scavenge,老年代默认的垃圾回收器为:PS MarkSweep 目前项目使用了jdk7,tomcat7,经常出现内存堆使 ...

  7. 网页设计——2. html入门

    开始正式的课程讲解了,首先来看看课程体系: Java EE(java 企业应用程序版本) java2 有三个版本:J2 SE(标准版),J2 EE(企业版).J2 ME(微缩版). 我们要掌握J2EE ...

  8. MySQL slave_exec_mode 参数说明

    背景: 今天无意当中看到参数slave_exec_mode,从手册里的说明看出该参数和MySQL复制相关,是可以动态修改的变量,默认是STRICT模式(严格模式),可选值有IDEMPOTENT模式(幂 ...

  9. c++用类写栈和队列的简单基本操作(实验)

    继续更文.这次用类来写栈和队列,都是用数组模拟的: 以下是栈和队列的定义: 然后分别是栈和队列的类: 完整代码贴上: 栈 //使用类来定义栈 class ZHAN { public: STACK s; ...

  10. 读取指定文件夹下的全部文件,可通过正则进行过滤,返回文件路径数组 -- 基于node的一个函数

    var fs = require('fs'); // 模板文件夹路径 var templateDirectory = '../src'; //相对于当前文件的相对路径 //var templateDi ...