SQL根据某些列在同一个表中查找行

时间:2013-10-17 21:36:51

标签: mysql

我有两个表用于两个不同的程序。每个程序都有一个特定的program_instance(program_instance)是程序的年份。

一个表称为'登记者',另一个表是'提名' - 用于两个与技术无关的程序。

我一直试图从两个表中得到过去参与者的数量。供参考:

program_instance_id:

  • 5 = GC 2014
  • 3 = GC 2013
  • 1 = GC 2012
  • 4 = GE 2013
  • 2 = GE 2012

所以我在我的enrollees表上运行了这个查询,它在913ms产生了一个结果:

SELECT      count(*) AS prev_enrollees
FROM       outreach.enrollees e1
WHERE e1.program_instance_id = 5 AND EXISTS 
    (SELECT * FROM outreach.enrollees e2
            WHERE e1.first_name = e2.first_name 
            AND e1.last_name = e2.last_name 
            AND e1.address1 = e2.address1 
            AND e1.state = e2.state 
            AND e1.zip = e2.zip 
            AND e2.program_instance_id < 5);

根据我的理解,这个查询会给我“登记者”表中的行数,其中当前年份的登记者(program_instance_id = 5)之前已在另一年登记。根据我的理解,它产生的结果非常准确。

所以...我在''nominations'表上运行了这个EXACT查询(更改表名)。提名表几乎具有“登记者”表的确切结构(某些列不同,但人员的信息字段相同)。在我取消之前,此查询运行了半个多小时。它并没有弹出几乎即时的结果,就像在登记者桌上一样,我不知道为什么需要更长的时间。

我可以想象如果表中有更多行,但是enrollee表的行数比提名表多了大约5万行。

我也试过了:

SELECT     count(*) AS prev_enrollees
FROM       outreach_grow_education.nominations e1
JOIN  outreach_grow_education.nominations e2 ON e1.first_name = e2.first_name 
AND e1.last_name = e2.last_name 
AND e1.address1 = e2.address1 
AND e1.state = e2.state 
AND e1.zip = e2.zip 
AND 4 = e2.program_instance_id
WHERE e1.id IS NOT NULL AND e1.program_instance_id = 2;
唉,同样的结果。对参与者的即时结果,在提名上永无止境。

对于我想要实现的不会导致永无止境的循环,还有其他替代方案吗?

1 个答案:

答案 0 :(得分:0)

我建议检查两个表的索引,特别是您在JOIN子句中使用的列:first_name,last_name,address1,state,zip和program_instance_id。有可能这些列中的一个或多个在“登记者”表中被索引,而不是在“提名”中。