MYSQL在where子句中使用count(1)?

时间:2013-04-22 19:04:21

标签: mysql sql count

我正在进行面部识别。我有一个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。

我想要做的是创建一个从personApersonB中选择facerecScorealgo_id的查询,其中facerecscore表中没有现有记录algo_id为1且比较是比较。

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

4 个答案:

答案 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);

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