MYSQL - 联接或子查询问题


MYSQL - Join or Subquery Issues

我正在尝试获取查询以返回我的特色项目表中特色产品的所有相关记录。 一切都适用于简单的 MYSQL 查询,但是我想获取每个产品两个的拇指图像,该图像存储在另一个表 (product_image( 中,但有一个捕获。在此"product_image"表中,并非每个产品(product_id(都有记录,因为它仅在上传图像时填充,并且某些产品可能有多个记录(存储的图像(,我只想为每个产品ID返回一条记录。 因此,产品表中的产品记录与product_image表具有 0 对多关系。

我有一个基本的基本SQL语句,无需返回图像,我可以编写一个查询,该查询仅返回在产品图像表中有记录的产品,但我需要查询返回外部查询中的所有行,然后返回1 thumb_img与图像表中的产品ID匹配,如果没有图像,它可以返回Null值。

这可能吗?以下是我的最新尝试,但这只返回第一product_ID的匹配拇指,并将其复制到其他 3 条(在这种情况下由于末尾的限制(记录。我需要每条记录的匹配拇指,而不是其余记录之间重复的第一条记录的匹配拇指。如果没有该产品 ID 的记录,则返回 null。

SELECT * FROM `products`, `featured_products`, `shop`, (SELECT thumbSrc
          FROM product_image
         WHERE products.productId = product_image.productID
        ORDER BY product_image.position ASC
         LIMIT 1) image
where shop.shopId = products.shopId AND featured_products.productId = products.productId AND visible = '1' LIMIT 4

提前感谢您的任何帮助/反馈。是否可以这样做,因为我想使我的数据库尽可能规范化,而不是在产品表中也存储一个拇指字段。

未经测试,并且可能有更好的(性能(方法来进行子选择...在我正在做的 PI 上。

实际上,这样做要做的是退回所有产品,相关的功能产品和商店。 然后仅返回具有匹配产品的图片;但前提是图像是位置最低的产品图像。 这样,如果缺少图像,产品、feature_product和商店就不会被排除在外(因此 LEFT [外部] 连接的性质(

SELECT *
FROM PRODUCTS P
INNER JOIN Featured_Products FP
 on P.ProductID = FP.ProductID
INNER JOIN SHOP S
 P.ShoPID = S.ShopID
LEFT JOIN (Select thmbsrc, productID, position, min(Position) as MinPosition
           FROM Product_Image PI
           group by thmbsrc, productID, Position
           having MinPosition = position) PI
 on PI.ProductID = P.ProductID

如果我们首先获得所有排名最低的产品 ID 的列表,然后将其连接回product_image以获得 imgsrc,则性能可能会提高。 类似 ( Select min(position) minPos, productID from product_Image ( 的东西可能允许 SQL 引擎查看每条记录一次,而不是查看 having 子句中的每个值(如果位置被索引,那么这会更快(。

所以。。。

SELECT *
FROM PRODUCTS P
INNER JOIN Featured_Products FP
 on P.ProductID = FP.ProductID
INNER JOIN SHOP S
 P.ShoPID = S.ShopID
LEFT JOIN (Select imgsrc FROM Product_Image PI
           INNER JOIN (Select min(position) minPos, productID 
                       from product_Image
                       GROUP BY ProductID) PI2
            on PI.ProductID = PI2.ProductID
           and PI.position = PI2.PminPos)
 on PI.ProductID = P.ProductID

根据表统计信息和可用索引,性能可能会更好。