【问题标题】:MYSQL - Join or Subquery IssuesMYSQL - 加入或子查询问题
【发布时间】:2016-02-01 19:42:07
【问题描述】:

我正在尝试查询以返回我的特色项目表中的产品的所有相关记录。一切都适用于简单的 MYSQL 查询,但是我想获取存储在另一个表(product_image)中但带有捕获的每个产品二的拇指图像。在此“product_image”表中,并非每个产品(product_id)都会有记录,因为它仅在上传图像时填充,并且某些产品可能有多个记录(存储的图像)我只希望为每个产品 ID 返回一个记录。所以products表中的一条product记录与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

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

【问题讨论】:

标签: php mysql sql database subquery


【解决方案1】:

未经测试,在我正在做的 PI 上,子选择可能有更好的(性能)方法。

实际上,这样做的目的是退回所有产品、相关的特色产品和商店。然后只返回那些有匹配产品的图像;但前提是图片是位置最低的产品图片。这样,如果缺少图像,产品、feature_product 和商店就不会被排除在外(因此是 LEFT [outer] join 的性质)

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 子句中的每个值(如果对 position 进行索引,那么这会更快)。

所以……

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

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

【讨论】:

    猜你喜欢
    • 2019-03-13
    • 2015-07-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-20
    相关资源
    最近更新 更多