根据另一个 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
我正在构建一个类似于 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