SQL select 'most appropriate' 记录的条件逻辑

SQL Conditional Logic to select the 'most appropriate' record

我大大简化了整个系统,但它足以解决我的特定问题。 我正在 table 中存储有关一张已缩小多次(保持其纵横比)的照片的信息。 我正在尝试为我的 table 设计一个可以取回最合适照片的查询。

我说的最合适的是

  1. 如果请求宽度为 705px,那么在这种情况下将返回最大的一个 700x394

  2. 如果我请求 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 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,并相应地应用下限查询。但这可能不是您正在寻找的选项。

--编辑:这与绝对函数的工作方式类似,但您可以根据需要对其进行更多控制。