MYSQL - 加入或子查询问题
MYSQL - Join or Subquery Issues
我正在尝试查询 return 我的特色项目 table 中特色产品的所有相关记录。所有这些都适用于简单的 MYSQL 查询,但是我想获取存储在另一个 table (product_image) 中的每个产品的缩略图图像,但有一个问题。在此 "product_image" table 并非每个产品 (product_id) 都会有记录,因为它仅在上传图片时填充,并且某些产品可能有多个记录(存储的图像)我只想要一个为每个产品 ID 记录 returned。因此,产品 table 中的产品记录与 product_image table.
具有 0 到多的关系
我有一个工作基本 SQL 基本语句,无需 return 图片,我可以编写查询代码,仅 return 产品中有记录的产品image table 但我需要查询 return 外部查询中的所有行,然后 1 thumb_img 与图像 table 中的产品 ID 相匹配,如果没有images 它可以 return 一个 Null 值。
这可能吗?下面是我最近的尝试,但这只是 return 第一个 product_ID 的匹配缩略图,并为其他 3 个(在本例中是由于末尾的限制)记录复制了它。我需要每个记录的匹配缩略图,而不是在其余记录之间重复的第一个记录的匹配缩略图。如果没有该产品 ID 的记录,则为 null returned.
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
在此先感谢您的帮助/反馈。是否可以这样做,因为我想让我的数据库尽可能规范化,而不是在产品中存储一个缩略图字段 table。
未经测试,可能有更好的(性能)子选择方法...我正在做的 PI。
这实际上是 return 所有产品、相关特色产品和商店。然后 return 只有那些具有匹配产品的图像;但前提是图像是位置最低的产品图像。这样,如果图像丢失,产品、feature_product 和商店不会被排除在外(因此 LEFT [outer] 连接的性质)
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
可能会根据 table 统计信息和可用索引执行得更好。
我正在尝试查询 return 我的特色项目 table 中特色产品的所有相关记录。所有这些都适用于简单的 MYSQL 查询,但是我想获取存储在另一个 table (product_image) 中的每个产品的缩略图图像,但有一个问题。在此 "product_image" table 并非每个产品 (product_id) 都会有记录,因为它仅在上传图片时填充,并且某些产品可能有多个记录(存储的图像)我只想要一个为每个产品 ID 记录 returned。因此,产品 table 中的产品记录与 product_image table.
具有 0 到多的关系我有一个工作基本 SQL 基本语句,无需 return 图片,我可以编写查询代码,仅 return 产品中有记录的产品image table 但我需要查询 return 外部查询中的所有行,然后 1 thumb_img 与图像 table 中的产品 ID 相匹配,如果没有images 它可以 return 一个 Null 值。
这可能吗?下面是我最近的尝试,但这只是 return 第一个 product_ID 的匹配缩略图,并为其他 3 个(在本例中是由于末尾的限制)记录复制了它。我需要每个记录的匹配缩略图,而不是在其余记录之间重复的第一个记录的匹配缩略图。如果没有该产品 ID 的记录,则为 null returned.
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
在此先感谢您的帮助/反馈。是否可以这样做,因为我想让我的数据库尽可能规范化,而不是在产品中存储一个缩略图字段 table。
未经测试,可能有更好的(性能)子选择方法...我正在做的 PI。
这实际上是 return 所有产品、相关特色产品和商店。然后 return 只有那些具有匹配产品的图像;但前提是图像是位置最低的产品图像。这样,如果图像丢失,产品、feature_product 和商店不会被排除在外(因此 LEFT [outer] 连接的性质)
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
可能会根据 table 统计信息和可用索引执行得更好。