前幾天看別人的代碼中看到在字段中使用select子查詢的方法,第一次見這種寫法,然后研究了一下,記錄下來
大概的形式是這樣的:
select a .*,(select b.another_field from b where a.id=b.aid) another_field from a where 1 limit 10;
下面還是以實例來說明,要不然不好理解,新建兩張表,一張是商品表,另外一張是商品的評論表
商品表:
- CREATE TABLE `product` (
- `id` int(11) NOT NULL AUTO_INCREMENT,
- `product_name` varchar(30) CHARACTER SET utf8 NOT NULL,
- `price` float NOT NULL,
- PRIMARY KEY (`id`)
- ) ENGINE=InnoDB;
評論表:
- CREATE TABLE `comment` (
- `id` int(11) NOT NULL AUTO_INCREMENT,
- `entity_id` int(11) NOT NULL,
- `content` varchar(100) CHARACTER SET utf8 NOT NULL,
- PRIMARY KEY (`id`)
- ) ENGINE=InnoDB;
然后插入一些數據:
- INSERT INTO `product` (`id`, `product_name`, `price`) VALUES
- (1, '肉松餅', 5),
- (2, '可樂', 5),
- (3, '雞翅', 12),
- (4, '杯子', 42);
- INSERT INTO `comment` (`id`, `entity_id`, `content`) VALUES
- (1, 1, '味道還不錯'),
- (2, 1, '還行啊'),
- (3, 3, '很實用哦');
下面我們用子查詢的方式來查出商品的信息以及每個商品的評論數量
- 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子查詢只能查詢一個字段。
另外的列子,查出每個商品信息以及商品的最新評論內容:
- 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:
