SQL--LEFT JOIN 右表多条数据解决方案

用到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)

执行结果:
这里写图片描述

猜你喜欢

转载自blog.csdn.net/BtWangZhi/article/details/80960522