2016-02-01 76 views
1

我想获得一个查询,以返回我的精选项目表中的产品的所有相关记录。所有正在为简单的MYSQL查询工作,但我想获得每个产品两个拇指图像存储在另一个表(product_image),但有一个捕获。在此“product_image”表中,不是每个产品(product_id)都会有一条记录,因为它仅在上传图像时填充,而某些产品可能有多个记录(存储图像),我只希望为每个产品ID返回一条记录。因此,产品表中的产品记录与product_image表有0到很多的关系。MYSQL - 加入或子查询问题

我有一个工作的基本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 

在此先感谢您的任何帮助/反馈。是否有可能这样做,因为我想保持我的数据库尽可能标准化,而不是导致在产品表中存储拇指字段。

+0

了解外部连接。并将product_Image加入产品表,而不是您的方法。我最喜欢的解释这些连接如何工作的网站之一是http://blog.codinghorror.com/a-visual-explanation-of-sql-joins/。 – xQbert

+0

谢谢,我会读入外部连接,非常感谢 – Chicker

回答

0

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

实际上,要搭建的是返回所有产品,相关特征产品和商店。然后只返回那些有匹配产品的图像;但只有在图像是位置最低的产品图像时才适用。这样的产品,feature_product和商店没有得到排除如果图像丢失(因此的左[外]性质加入)

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 

可能因表的统计信息和可用指标有更好的表现。