如果ID存在于第二张或第三张表中,如何从第一张表中高效选择?

Posted

技术标签:

【中文标题】如果ID存在于第二张或第三张表中,如何从第一张表中高效选择?【英文标题】:How to select from first table if ID exist in second or third table with high efficiency? 【发布时间】:2016-08-23 22:43:03 【问题描述】:

我有 3 张桌子在分配。 第一张表: 患者:patid、fname、lname、recordnum。 PATIENTDR:patid,drid, PATIENTCLIN:patid,临床。

如果 DRID="$docotr->id" 或 "PATIENTCLIN" 如果 CLINID="$clinic- 在表 "PATIENTDR" 中找到表 "PATIENT" 中的 "PATID",我需要按 fname 或 lname 选择患者>临床”

这是我的查询

SELECT t1.* FROM patient t1  
WHERE patlname like  '$search_patlname%' 
AND patfname like '$search_patfname%' 
AND 
(  
 EXISTS 
   (SELECT patid FROM patientdr t2 WHERE t2.drid = '$doctor->id' AND t2.patid = t1.patid) 

     OR  EXISTS 

   (SELECT patid FROM patientclin t3 WHERE t3.clinid = '$clinic->clinid' AND t3.patid = t1.patid) 
 ) 
LIMIT 10

患者数量可能非常多,将使用 ajax 检索数据并考虑以下注意事项:

“在 mysql 中使用 EXISTS 条件的 SQL 语句效率非常低,因为子查询对外部查询表中的每一行都重新运行。有更有效的方法来编写大多数查询,不使用 EXISTS条件。”

是否有更有效的方法来编写此查询,也许我应该打破规则并将患者 fname 和 lname 插入表 patientdr 和 patientclin 以减少响应时间,或者将结果限制为 10 行是否足够有效? 提前感谢您提供的各种帮助。

【问题讨论】:

如果你在内部加入它们并且 id 没有匹配,那么它们将不会在结果中返回。我想那会是最有效的。 【参考方案1】:

正如 cmets 中提到的,这可以通过简单的 INNER JOIN 来解决:

SELECT t1.* 
FROM patient t1
INNER JOIN (
    SELECT patid 
    FROM patientdr t2 
    WHERE t2.drid = '$doctor->id' 
    UNION DISTINCT
    SELECT patid 
    FROM patientclin t3 
    WHERE t3.clinid = '$clinic->clinid'
) i
ON t1.patid = i.patid
WHERE patlname like  '$search_patlname%' 
AND patfname like '$search_patfname%' 
LIMIT 10

如果您还没有阅读有关 INNER JOIN 的文档,那么值得花时间阅读并尝试一些使用它的查询。

祝你好运!

【讨论】:

@jakebules 嗯.. 如果在其他两个表中找到相同的 id,我会得到两个患者作为结果。结果不应该与此查询连接,只有一个患者作为一个 id 的结果? @jakebules 用 UNION DISTINCT 修复了它,请您更新答案,谢谢。

以上是关于如果ID存在于第二张或第三张表中,如何从第一张表中高效选择?的主要内容,如果未能解决你的问题,请参考以下文章

如何将一张表中的记录插入到第二张表中

怎样用Sql语句判断一张表中的两条数据相同

sql中怎么才能实现两张表 数据自动匹配

oracle的数据库中怎么将一张表中数据插入另一张表,两张表都存在

需要帮助连接 SQL

SQL多张表如何合并成一张报表?