SQL条件逻辑选择“最合适”的记录

时间:2015-05-29 20:00:28

标签: mysql sql database database-schema

我大大简化了整个系统,但它足以显示我的特定问题。 我在一张表格中存储了一张已经缩小了几次的照片的信息(保持其宽高比)。 我正试图在我的桌子上设计一个可以找回最合适照片的查询。

最合适的意思是

  1. 如果请求宽度为705px,那么最大的请求将返回700x394

  2. 如果我要求50px宽度,则在这种情况下将返回最小的150x84

  3. 示例数据照片调整尺寸

      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小提琴,我在这里提出了我的问题/问题

    非常感谢任何见解。我知道我可以读取所有数据,然后用我的后端语言(如PHP)执行此逻辑,但这是在高需求数据管道上,并且希望最小化开销。

    小提琴: http://sqlfiddle.com/#!9/91ca9/2

2 个答案:

答案 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中执行此操作,并相应地应用下限查询。但这不是你正在寻找的选择。

- 编辑:这与绝对功能类似,但您可以根据需要对此进行更多控制。