0

我正在做面部识别。我有一个 A 组人员和 B 组人员的数据库。我想检查 A 中的每个人和 B 中的每个人。我正在运行许多不同的算法来验证面孔。为此,我设置了以下表格

comparison (
    id int,
    personA_id int,
    personB_id int,
)

facerecScore (
    id int,
    score int,
    comparison_id int,
    algo_id int,
 )

因此,假设我有一个 eigenfaces 程序作为我正在测试的第一个算法运行。特征脸的algo_id值为 1。

我想要做的是进行一个查询,从比较中选择personA和比较,其中表中personB不存在现有记录,其中1 并且比较是该比较。facerecScorealgo_id

换句话说,如果我已经对这两个人运行了特征脸,我不想再运行它。因此,我不想选择facerecscore表中已有记录的比较algo_id为 1

4

4 回答 4

1

对于讨厌相关子查询的任何人(例如,出于性能原因,如果原始查询未优化),可以使用左连接并排除实际连接的任何行:

更新:受@penfold 的“查找所有”答案的启发,如果algo_ids 的列表已知(并且很短),则这是一个 join+union 替代方案:

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
于 2013-04-22T19:20:42.567 回答
1

您可以尝试以下类似的操作,它将查找所有comparison没有记录的行,其中facerecScorealgo_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

于 2013-04-22T19:11:48.220 回答
0

你可以使用它,它会返回第一个未被触及的组合。删除最后一部分Limit 1,1,您将获得所有未触及的组合。

SELECT *
  FROM comparison
 WHERE id
not in (
       select comparison_id
       from facerecScore
       where algo_id = 1)
 Limit 1,1
于 2013-04-22T19:13:13.330 回答
0
SELECT personA_id, personB_id FROM comparison WHERE id NOT IN (SELECT comparison_id FROM facerecScore WHERE algo_id = 1);

这可能对子查询的效率非常不利,但它应该会给你正确的结果。可能其他人可以找到更有效的解决方案。

于 2013-04-22T19:13:53.487 回答