用到SQL中的LEFT JOIN时,在右表中存在多条记录,即一对多的情况时,
表结构与数据:
CREATE TABLE `image` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`productId` int(11) DEFAULT NULL,
`name` varchar(255) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8;
-- ----------------------------
-- Records of image
-- ----------------------------
INSERT INTO `image` VALUES ('1', '1', '商品1的图片1');
INSERT INTO `image` VALUES ('2', '1', '商品1的图片2');
INSERT INTO `image` VALUES ('3', '1', '商品1的图片3');
INSERT INTO `image` VALUES ('4', '2', '商品2的图片1');
INSERT INTO `image` VALUES ('5', '2', '商品2的图片2');
INSERT INTO `image` VALUES ('6', '3', '商品2的图片1');
CREATE TABLE `product` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(255) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8;
-- ----------------------------
-- Records of product
-- ----------------------------
INSERT INTO `product` VALUES ('1', '商品1');
INSERT INTO `product` VALUES ('2', '商品2');
INSERT INTO `product` VALUES ('3', '商品3');
执行左关联查询:
SELECT * FROM product AS p LEFT JOIN image AS img ON p.id=img.productId
执行结果:
发现一对多关联然后全部查询出来了。
现在只需要改查询商品的最后一张图片,入商品1对应的商品图片3。
方案1:
先按图片降序排序,然后按商品id进行分组,即得每一个商品的最后一张图片信息。
SELECT * FROM (SELECT * FROM image ORDER BY id DESC) AS temp_image GROUP BY temp_image.productId
方案2:
根据产品id分组求出每个分组的最大图片id,在外面套一层查询图片信息即可
SELECT * FROM image WHERE id IN (SELECT CONCAT(MAX(id),',') AS id FROM image GROUP BY productId)
执行结果: