我正在进行面部识别。我有一个A组人员和B组人员的数据库。我想检查A中的每个人与B中的每个人。我正在运行许多不同的算法来验证面部。为此,我设置了下表
comparison (
id int,
personA_id int,
personB_id int,
)
facerecScore (
id int,
score int,
comparison_id int,
algo_id int,
)
让我们说我有一个特征脸程序作为我正在测试的第一个算法运行。特征脸的algo_id
为1。
我想要做的是创建一个从personA
和personB
中选择facerecScore
和algo_id
的查询,其中facerecscore
表中没有现有记录algo_id
为1且比较是比较。
换句话说,如果我已经在这两个人身上运行了特征脸,我不想再次运行它。因此,我不想选择已在{{1}}表中有{{1}}为1的记录的比较
答案 0 :(得分:1)
您可以尝试使用以下内容,它会在comparison
中找到facerecScore
中没有algo_id
条记录的所有行,参数:current_algo
给出的SELECT *
FROM comparison
WHERE id not in (
SELECT comparison_id
FROM facerecScore
WHERE algo_id = :current_algo
);
algo_ids
在您要查找facerecScore
中没有相应记录的所有SELECT *
FROM comparison, (SELECT algo_id FROM facerecScore GROUP BY algo_id) algo
WHERE id not in (
SELECT comparison_id
FROM facerecScore
WHERE algo_id = algo.algo_id
);
的所有比较行的方案中,您可以使用以下内容。
comparison
只需此查询首先找到algo_id
行和facerecScore
的所有组合,然后从结果集中删除任何在{{1}}中有记录的组合。
答案 1 :(得分:1)
对于讨厌相关子查询的任何人(例如出于性能原因,如果未优化原始查询),可以使用左连接并排除实际连接的任何行:
更新:受@ penfold“全部”回答的启发,如果algo_id
的列表已知(简称),则这是一个加入+联合替代方案:
select '1' algo_id, c.*
from comparison c
left join facerecScore f
on c.id = f.comparison_id
and f.algo_id = 1
where f.id is null
union all
select '2' algo_id, c.*
from comparison c
left join facerecScore f
on c.id = f.comparison_id
and f.algo_id = 2
where f.id is null
...
或更普遍的(不确定哪一个会表现更好):
select a.algo_id, c.id
from comparison c
cross join (select algo_id from facerecScore group by algo_id) a
left join facerecScore f
on c.id = f.comparison_id
and f.algo_id = a.algo_id
where f.id is null
答案 2 :(得分:0)
您可以使用此功能,它将返回尚未触及的第一个组合。删除最后一部分Limit 1,1
,您将获得所有未触及的组合。
SELECT *
FROM comparison
WHERE id
not in (
select comparison_id
from facerecScore
where algo_id = 1)
Limit 1,1
答案 3 :(得分:0)
SELECT personA_id, personB_id FROM comparison WHERE id NOT IN (SELECT comparison_id FROM facerecScore WHERE algo_id = 1);
这对于子查询的效率可能非常糟糕,但它应该会给你正确的结果。可能其他人可以找到更有效的解决方案。