根据另一个 table 过滤

Filter based on another table

我正在构建一个类似于 tinder 的图像评级系统。

我需要找到与所提供图片的评分最接近的图片。 并且这些图像对不存在于比较中 table。

第一部分很简单,看起来像这样

SELECT images.file_path, images.id
FROM images JOIN ratings ON images.id = ratings.image 
WHERE images.id != ? AND ratings.label = ? 
ORDER BY abs(? - ratings.mu) ASC

然后我有一个 table 包含以下信息,我需要确保第一个查询的结果不会产生 table

中包含的对
img1: Integer - Image id
img2: Integer - Image id
outcome: Integer - Not relevant to question

现在我正在使用 SQLite 进行测试,但适用于多个数据库的解决方案对于进一步开发非常有用

例子 图片table(省略file_path)

id, label, mu
1, 1, 1.5
2, 1, 2.0
3, 1, 2.5
4, 1, 3.5

比较table(省略结果)

img1, img2
1, 2
2, 3
3, 4

id 为 1 的图像的示例结果 = id 为 3 的 img。因为它的评级最接近 1.5 并且不能是图像 2,因为这对在比较中 table

您可以使用 NOT EXISTS 过滤掉不应该出现的内容。

WITH img AS (
  SELECT id as image_id, label, mu
  FROM images
  WHERE id = 1
)
SELECT 
  images.file_path
, images.id as image_id
, ratings.mu as rating_mu
, ratings.label as rating_label
FROM images 
CROSS JOIN img
INNER JOIN ratings
  ON images.id = ratings.image 
 AND ratings.label = img.label 
WHERE NOT EXISTS (
  SELECT 1
  FROM comparison c
  WHERE images.id in (c.img1, c. img2) 
    AND img.image_id in (c.img1, c. img2)
)
ORDER BY abs(img.mu - ratings.mu) ASC
LIMIT 1;
file_path    | image_id | rating_mu | rating_label
:----------- | -------: | --------: | -----------:
/img/foo.png |        3 |       2.5 |            1

测试 db<>fiddle here