【问题标题】:MySql-multiple where conditionsMySql-多个where条件
【发布时间】:2015-06-16 17:09:40
【问题描述】:

您好,提前感谢您的帮助。

我正在使用 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 诊断1
1 诊断3
b 2 诊断2
b 2 诊断5
c 3诊断1

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

【问题讨论】:

  • 我不明白为什么你会认为它们会有所不同。您能否提供一些示例数据以及您对该数据的预期结果?
  • 感谢@MrFlick,我添加了一个希望对您有所帮助的示例!从本质上讲,我从未指定每次访问可以有多个诊断
  • @EmilyV,查看我编辑的答案。

标签: mysql r where


【解决方案1】:

问题在于您的 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 组成的组,您必须在选择子句中同时选择patientvisit(到获得明确的结果集数据),并且在第二个查询中,having 子句必须与 patientvisit 相关。

【讨论】:

  • 感谢@bgoldst,你让它看起来如此简单!是的,您在第二段中提到的条件是真实的,每次访问都是独一无二的。但是,代码不起作用。但也许我没有正确使用它,你能解释一下你的 o 和 o.什么意思?
  • 在我的查询中o 是一个表别名。有必要区分相关子查询中的o.visit 名称,我基本上需要从database 表中加入“外部”记录(这就是我选择o 作为别名时的想法) DBMS 在应用子查询时扫描的“内部”记录。换句话说,如果你说visit=visit 之类的话,visit=o.visit 连接条件将不起作用,因为这两个名称都会绑定到内部记录。
  • 这是对SQL中别名的一个很好的总结:en.wikipedia.org/wiki/Alias_(SQL)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-06-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-24
相关资源
最近更新 更多