gpt4 book ai didi

mysql - SQL根据某些列查找同一个表中的行

转载 作者:行者123 更新时间:2023-11-30 01:11:32 25 4
gpt4 key购买 nike

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

一个表称为“登记者”,另一个表称为“提名” - 对于两个技术上不相关的项目。

我一直在尝试从两个表中获取过去参与者的数量。供引用:

程序实例 ID:

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

所以我在我的登记表上运行了这个查询,它在 913 毫秒内生成了结果:

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

据我了解,此查询将为我提供“enrollees”表中的行数,其中当年的注册者 (program_instance_id = 5) 之前曾在另一年注册过。据我了解,它产生的结果非常准确。

所以...我在我的“提名”表上运行了这个精确查询(更改表名称)。提名表的结构几乎与“登记者”表完全相同(某些列不同,但人员的信息字段相同)。这个查询运行了半个多小时,然后我取消了它。它不会像登记表上那样几乎立即显示结果,我不知道为什么需要更长的时间。

我可以想象如果表中有更多行,但登记表比提名表多大约 50k 行。

我也尝试过:

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;

唉,结果是一样的。登记者即时结果,提名永无止境。

是否有任何其他替代方案可以实现我想要实现的目标,而不会导致永无休止的循环?

最佳答案

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

关于mysql - SQL根据某些列查找同一个表中的行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19437790/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com