SQL select 'most appropriate' 记录的条件逻辑
SQL Conditional Logic to select the 'most appropriate' record
我大大简化了整个系统,但它足以解决我的特定问题。
我正在 table 中存储有关一张已缩小多次(保持其纵横比)的照片的信息。
我正在尝试为我的 table 设计一个可以取回最合适照片的查询。
我说的最合适的是
如果请求宽度为 705px,那么在这种情况下将返回最大的一个 700x394
如果我请求 50px 宽度,那么在这种情况下将返回最小的宽度 150x84
样本数据照片尺寸调整
700x394
400x200
300x169
150xx84
更多信息
- 数据库中的图像都使用参考边缘按比例缩小。
- 参考边是最长的边,这意味着如果我收到肖像照片,它会按比例缩小到 *x700、*x400、*x300、*x150。
- 如果图片是横向的,它会以同样的方式缩小尺寸 700x*、400x*、300x*、150x*
此查询部分适用于从 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 Fiddle 在这里我有我的 question/problem 概述
如有任何见解,我们将不胜感激。我知道我可以读入所有数据,然后用我的后端语言(例如 PHP 执行此逻辑,但这是在高需求数据管道上,希望将开销降至最低。
Fiddle: http://sqlfiddle.com/#!9/91ca9/2
试试这个
SELECT *
FROM images
ORDER BY ABS(width-750) ASC
LIMIT 1
使用宽度的绝对值减去请求的尺寸,它将return 为您提供最接近的图像尺寸。我相信你可以调整它,因为你还需要检查身高
我可以从您的问题中推断出,如果不存在上限,您希望输出与 width
中最接近的最低值相匹配的图像细节。因此,下面提到的查询合并了两个输出和 return 它们按升序排列。如果存在上限,它将被 returned,否则最接近 width
的下限将被 returned。您可以使用查询来满足您的需要。
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 ;
或者,您可以在 php 中轻松执行此操作,方法是检查上限查询是否为 returns NULL
,并相应地应用下限查询。但这可能不是您正在寻找的选项。
--编辑:这与绝对函数的工作方式类似,但您可以根据需要对其进行更多控制。
我大大简化了整个系统,但它足以解决我的特定问题。 我正在 table 中存储有关一张已缩小多次(保持其纵横比)的照片的信息。 我正在尝试为我的 table 设计一个可以取回最合适照片的查询。
我说的最合适的是
如果请求宽度为 705px,那么在这种情况下将返回最大的一个 700x394
如果我请求 50px 宽度,那么在这种情况下将返回最小的宽度 150x84
样本数据照片尺寸调整
700x394
400x200
300x169
150xx84
更多信息
- 数据库中的图像都使用参考边缘按比例缩小。
- 参考边是最长的边,这意味着如果我收到肖像照片,它会按比例缩小到 *x700、*x400、*x300、*x150。
- 如果图片是横向的,它会以同样的方式缩小尺寸 700x*、400x*、300x*、150x*
此查询部分适用于从 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 Fiddle 在这里我有我的 question/problem 概述
如有任何见解,我们将不胜感激。我知道我可以读入所有数据,然后用我的后端语言(例如 PHP 执行此逻辑,但这是在高需求数据管道上,希望将开销降至最低。
Fiddle: http://sqlfiddle.com/#!9/91ca9/2
试试这个
SELECT *
FROM images
ORDER BY ABS(width-750) ASC
LIMIT 1
使用宽度的绝对值减去请求的尺寸,它将return 为您提供最接近的图像尺寸。我相信你可以调整它,因为你还需要检查身高
我可以从您的问题中推断出,如果不存在上限,您希望输出与 width
中最接近的最低值相匹配的图像细节。因此,下面提到的查询合并了两个输出和 return 它们按升序排列。如果存在上限,它将被 returned,否则最接近 width
的下限将被 returned。您可以使用查询来满足您的需要。
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 ;
或者,您可以在 php 中轻松执行此操作,方法是检查上限查询是否为 returns NULL
,并相应地应用下限查询。但这可能不是您正在寻找的选项。
--编辑:这与绝对函数的工作方式类似,但您可以根据需要对其进行更多控制。