MYSQL - 加入或子查询问题

时间:2016-02-01 19:42:07

标签: php mysql sql database subquery

我正在尝试查询以返回我的精选项目表中的所有产品的相关记录。所有这些都适用于简单的MYSQL查询,但我希望得到每个产品的Thumb Image,它存储在另一个表(product_image)中,但带有catch。在这" product_image"表不是每个产品(product_id)都会有一个记录,因为它只在上传图像时填充,而某些产品可能有几个记录(图像存储)我只想为每个产品ID返回一个记录。因此,products表中的产品记录与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

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

1 个答案:

答案 0 :(得分:0)

未经测试,并且对于子选择可能有更好的(性能)方法......对于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

如果我们首先获得具有最低位置的所有productID的列表,然后将其连接回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

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