1. 程式人生 > >MySQL在欄位中使用select子查詢

MySQL在欄位中使用select子查詢

前幾天看別人的程式碼中看到在欄位中使用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;
查詢結果如下:

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;

查詢結果如下:

1 肉鬆餅5 還行啊

2 可樂5 NULL

3 雞翅12 很實用哦

4 杯子42 NULL