- 开发环境 MySQL版本: 5.5.49
DROP TABLE IF EXISTS `products`;
CREATE TABLE `products` (
`pid` int(11) NOT NULL AUTO_INCREMENT,
`pname` varchar(20) DEFAULT NULL,
`price` double DEFAULT NULL,
`pnum` int(11) DEFAULT NULL,
`cno` int(11) DEFAULT NULL,
`pdate` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`pid`)
) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8;
INSERT INTO `products` VALUES ('1', '泰国大榴莲', '98', '12', '1', '2018-02-26 15:52:32');
INSERT INTO `products` VALUES ('2', '新疆大枣', '38', '123', '1', '2018-02-26 15:52:32');
INSERT INTO `products` VALUES ('3', '新疆切糕', '68', '50', '2', '2018-02-26 15:52:32');
INSERT INTO `products` VALUES ('4', '十三香', '10', '200', '3', '2018-02-26 15:52:32');
INSERT INTO `products` VALUES ('5', '老干妈', '20', '180', '3', '2018-02-26 15:52:32');
INSERT INTO `products` VALUES ('6', '豌豆黄', '20', '120', '2', '2018-02-26 15:52:32');
INSERT INTO `products` VALUES ('7', '新疆大枣', '35', '100', '3', '2018-10-23 10:44:09');
INSERT INTO `products` VALUES ('8', '新疆大枣', '63', '80', '1', '2018-10-23 10:44:27');
products表整体的情况如下
需求, 查询出当前年内的,新疆大枣占了多少该数据库多少列
错误的写法,不用子查询.SELECT
COUNT(*)
FROM
products
GROUP BY
pname
HAVING
pdate >= "2018-01-01"
AND "2018-12-31" > pdate
AND pname = "新疆大枣"
报错信息如下 Unknown column 'pdate' in 'having clause'
说的是找不到列pdate. 原因是select中使用的是count(*) , 没有pdate列, 导致了报错.
SELECT COUNT(*) from (
SELECT
pname,pdate
FROM
products
WHERE
pdate >= "2018-01-01"
AND "2018-12-31" > pdate
AND pname = "新疆大枣"
)tt
结果如下图 可以看到查询出了数量为3个. 这次之所以能查询出来, 是因为嵌套的子查询中, 有pname,pdate这两列. 更为简便的写法
SELECT
COUNT(*)
FROM
products
WHERE
pdate >= "2018-01-01"
AND "2018-12-31" > pdate
AND pname = "新疆大枣"
直接不使用子查询,直接where条件查询即可. 查询出当前年的,pname为新疆大枣的. 复杂的问题简单化