MySql-multiple where条件

时间:2015-04-10 21:01:29

标签: mysql r where

您好,感谢您的帮助。

我使用MAX数据库进行一些研究。我试图将我的观察结果限制在特定的诊断中,在同一次就诊中没有感兴趣的感染。

这是我到目前为止所做的:

y<-dbGetQuery(conn, "select visit from database 
WHERE diag IN ('diag1', 'diag2')group by visit") 
~this yields 100 obs

y2<-dbGetQuery(conn, "select visit from database 
WHERE diag IN ('diag1', 'diag2' ) 
and diag NOT IN ('diag3', 'diag4') group by visit")
~this also yields 100 obs

由于我得到相同的号码,我很确定这不符合我想要的方式。我是R和MySql的新手,所以任何建议都会非常感激。

我想我应该解释一下,每次访问都可以进行多次诊断。也许一个例子可以帮助我更好地解释我的问题:

患者:访问:诊断:
    1 diag1
1 diag3
b 2 diag2
b 2 diag5
c 3 diag1

因为我只对分析没有诊断为diag3或diag4的diag1或diag2患者的患者感兴趣,我只对我的分析中的患者B和C感兴趣,而不是患者a。

1 个答案:

答案 0 :(得分:2)

问题出在您的SQL查询中。查询

select visit from database WHERE diag IN ('diag1', 'diag2') group by visit

相同
select visit from database WHERE diag IN ('diag1', 'diag2' ) and diag NOT IN ('diag3', 'diag4') group by visit

原因是第二个查询and diag NOT IN ('diag3', 'diag4')中的附加条件必然为真,因为第一个条件对于两个查询diag IN ('diag1', 'diag2')都是通用的。换句话说,如果diag'diag1''diag2'之一,则它不能是'diag3''diag4'中的一个。


修改:查看您的示例数据,我想我了解您的目标。您的第二个查询必须重写如下:

select o.visit from database o where o.diag in ('diag1','diag2') group by o.visit
having not exists (select 1 from database where visit=o.visit and diag in ('diag3','diag4'))

having子句基本上类似于where子句,除了在分组(在group by子句中定义)之后应用已应用,因此您可以对每个组进行整体过滤。在您的情况下,在应用having子句之前的查询将选择所有访问1,2和3,然后我写的having条件排除任何涉及诊断的访问'diag3''diag4',最终不包括访问1。

注意:我们假设每个visit号码对于单个patient是唯一的,例如如果patient='a'visit=1,那么没有其他患者可以拥有visit=1,因为这样可以了解您的示例数据中的内容,以及您的查询所暗示的内容。如果情况不成立,则patientvisit必须将查询(实际上两个查询都必须重写)分组,您必须同时选择patient您的select子句中的visit(以获得明确的结果集数据),并且在第二个查询中,having子句必须与patient以及{{1}相关联}}