Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/57.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 如何根据唯一条件从两个表中获取数据。我觉得加入不是一个合适的解决方案_Mysql_Sql_Database_Join_Backend - Fatal编程技术网

Mysql 如何根据唯一条件从两个表中获取数据。我觉得加入不是一个合适的解决方案

Mysql 如何根据唯一条件从两个表中获取数据。我觉得加入不是一个合适的解决方案,mysql,sql,database,join,backend,Mysql,Sql,Database,Join,Backend,我有两个表,一个是User,另一个是TreatmentStatusTable。用户表有两种类型的用户,一种是医生,另一种是患者。医生可以对患者进行治疗,并将状态输入到治疗状态表中 医生每次看病人都会被打上记号。在下一个问题中,我只想看那些到目前为止医生还没有看过的病人。我应该如何有效地实现它 这是我的场景: 使用者 治疗状态表 treated_by- User.id (UserId of doctor) treated_to User.id (UserId of patient) treatme

我有两个表,一个是User,另一个是TreatmentStatusTable。用户表有两种类型的用户,一种是医生,另一种是患者。医生可以对患者进行治疗,并将状态输入到治疗状态表中

医生每次看病人都会被打上记号。在下一个问题中,我只想看那些到目前为止医生还没有看过的病人。我应该如何有效地实现它

这是我的场景:

使用者

治疗状态表

treated_by- User.id (UserId of doctor)
treated_to User.id (UserId of patient)
treatment_status  cured/referd
现在我想在用户表中找到医生没有找到的所有剩余患者 有机会见到病人吗

因此,查询应该类似于

Select * 
from User 
where user.id not in (
                        Select User.id 
                        from TreatmentStatusTable 
                        where treated_by= User.id).   <- this the doctor's user.id
所以基本上是从医生还没有看过的用户表中获取所有用户

上面的问题对我有用。但我相信,一旦后面的query2nd查询的结果大小达到几千,这个查询就会失败

有谁能给我一个更好的方法,以更有效的方式查询这些数据吗?

我想你不希望存在。大概是这样的:

select u.*
from users u
where u.user_type = 'patient' and
      not exists (select 1 
                  from treatmentstatustable tst
                  where tst.treated_to = u.id
                 );

为了提高性能,您需要在TreatmentStatusTableTreatted\u上创建一个索引。对于上万行或更多行,性能应该很好。

我不知道为什么您认为联接不是一个合适的解决方案

我会这样写:

Select u.* 
from User AS u
left outer join TreatmentStatusTable AS t 
  on u.id = t.treated_to
where t.treated_to is null
如果给定用户没有匹配的行,则外部联接将为t中的列返回null。如果我们使用where条件将结果限制在t为空的情况下,那么它必须是没有看过医生的用户


这是编写排除联接以查找不匹配行的常用方法。

在过程中的什么时候在TreatmentStatusTable中创建行?在子查询中使用SELECT*无论如何都无效,因为*将每行返回三列。您无法将其与外部查询谓词中的单个列进行比较。我如何使用它仅获取userType=patient并限制每次仅获取N条记录。你应该能弄明白的。谢谢。此查询正在运行。我想要一个关于TreatmentStatusTableTreatted\u的索引?这对性能有什么帮助?这使得不存在子查询只是一个索引查找。很难比这更快。谢谢。这回答了我的问题。你能告诉我,在我的场景中,这两种方法中哪一种效果更好?
Select u.* 
from User AS u
left outer join TreatmentStatusTable AS t 
  on u.id = t.treated_to
where t.treated_to is null