mysql查询从一组不同大小的图像中获取最接近的图像大小

qco9c6ql  于 2021-08-13  发布在  Java
关注(0)|答案(1)|浏览(221)

我在主持产品图片。每个图像都生成了多个大小(宽度):

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,这取决于一些事情。

r6hnlfcb

r6hnlfcb1#

这就是最终对我起作用的原因:

SELECT p.filePath as parentFilePath, p2.filePath as childFilePath
FROM photos p
LEFT JOIN photos p2 ON (p2.parentId = p.id AND p2.sizeId = <the size I want>)
WHERE
    p.productId = 1234
    AND p.parentId IS NULL -- don't get children

这将给我的原始图像(父)和可能的大小,我想要的(子)。所以在我的程序中,对于每一行,我可以检查 childFilePath 存在并使用它,或者如果它不存在就使用它 parentFilePath .
如果有人出于某种原因认为这是一个糟糕的解决方案,请发表评论。

相关问题