我大大简化了整个系统,但它足以显示我的特定问题。 我在一张表格中存储了一张已经缩小了几次的照片的信息(保持其宽高比)。 我正试图在我的桌子上设计一个可以找回最合适照片的查询。
最合适的意思是
如果请求宽度为705px,那么最大的请求将返回700x394
如果我要求50px宽度,则在这种情况下将返回最小的150x84
示例数据照片调整尺寸
700x394
400x200
300x169
150xx84
更多信息
此查询部分适用于0到最大边或更低边。但是,如果我请求的尺寸超过最大宽度,它就不起作用。
select * from images
WHERE width >= 750
order by width asc
limit 1
我也有这个工作技巧来改变基于肖像或风景的逻辑
IFNULL(((width >= height AND width >= $length ) OR (width <= height AND height >= $length )), TRUE)
我有一个SQL小提琴,我在这里提出了我的问题/问题
非常感谢任何见解。我知道我可以读取所有数据,然后用我的后端语言(如PHP)执行此逻辑,但这是在高需求数据管道上,并且希望最小化开销。
答案 0 :(得分:3)
试试这个
SELECT *
FROM images
ORDER BY ABS(width-750) ASC
LIMIT 1
使用宽度减去请求尺寸的绝对值,它将返回最近的图像尺寸。我确定你可以调整它,因为你需要检查身高
答案 1 :(得分:2)
我可以从您的问题中推断出,如果上限不存在,您希望输出与width
中最接近的最低值匹配的图像细节。因此,下面提到的查询合并两个输出并按升序返回它们。如果存在上限,则将返回,否则将返回width
的最接近的下限。您可以使用查询来满足您的需求。
SELECT id, width, height
FROM
( ( SELECT id, height, width, 750-width AS diff
FROM images
WHERE width < 750
ORDER BY width DESC
LIMIT 1
)
UNION ALL
( SELECT id, height, width, width-750 AS diff
FROM images
WHERE width >= 750
ORDER BY width ASC
LIMIT 1
)
) AS tmp
ORDER BY diff asc
LIMIT 1 ;
或者你可以通过检查上限查询是否返回NULL
来轻松地在php中执行此操作,并相应地应用下限查询。但这不是你正在寻找的选择。
- 编辑:这与绝对功能类似,但您可以根据需要对此进行更多控制。