我在主持产品图片。每个图像都生成了多个大小(宽度):
hero - 2800px
banner - 1200px
large -- 1024px
medium -- 768px
small -- 500px
preview -- 300px
thumbnail -- 200px
我的 photos
表如下所示:
id,
productId, -- what product this is a photo of
sizeId, -- foreign key to the `sizes` table
parentId, -- if this is a resized photo, the `parentId` references the original photo
filePath, -- where the photo is stored
width,
height
以及 sizes
表格:
id,
name, -- e.g. 'hero', 'banner', 'large', etc.
width -- width in pixels of this size
在生成图像尺寸时,如果原始图像小于某个尺寸,则不会生成该尺寸(即,永远不会放大图像)。例如,如果原始图像的宽度为1000px,则不会为其生成大的、横幅的或英雄大小的图像。
如果我正在查看一个产品,我想获取该产品的所有图像。我还希望能够指定我想要的图像大小(例如,如果我的设计只需要500px宽的图像,那么我只需要获取 small
尺寸)。如果我请求的图像大小不是为某张照片生成的(例如,我请求的是英雄图像,但原始图像的宽度为1000px,并且没有为其生成英雄大小),我希望取回下一个最大的图像大小。
如果具体大小不存在,我不确定如何有效地从数据库中获取下一个最大的图像。我可以用算法来完成,但我更喜欢用查询来完成。
需要注意的一点是,如果一个大小不存在,那么下一个最大的总是原始图像(因为我会缩小图像,但不会放大,所以只有在需要放大图像的情况下才会出现大小不存在的情况)。
到目前为止,我的想法是选择一个产品的所有照片,左加入 sizes
桌上的table sizeId
匹配我要找的那个,有一个 where
只选择成功加入到 sizes
桌上还是没有 parentId
(即原始图像)。在这一点上,我不知道如何摆脱原来的形象项目,如果我成功地匹配了它的一个孩子的照片 sizes
表(即我要查找的图像的确切大小)。
SELECT p.*
FROM photos p
LEFT JOIN sizes s ON (p.sizeId = s.id)
WHERE
p.productId=1234
AND (p.parentId IS NULL OR (s.id IS NOT NULL AND p.sizeId = 222))
就像我说的,这个查询的问题是,我最终可能会得到每张照片的两行(即,如果大小存在,我将得到该大小和原始大小)。
我的问题是,有没有更好的办法解决这个问题?如果没有,我如何为每张照片只获取一行(即大小,如果存在,或者原始/父级,如果没有)?
仅供参考,我可能会使用mysql 8.x,但可能会使用5.x,这取决于一些事情。
1条答案
按热度按时间r6hnlfcb1#
这就是最终对我起作用的原因:
这将给我的原始图像(父)和可能的大小,我想要的(子)。所以在我的程序中,对于每一行,我可以检查
childFilePath
存在并使用它,或者如果它不存在就使用它parentFilePath
.如果有人出于某种原因认为这是一个糟糕的解决方案,请发表评论。