SQL表设计(从表中选择*,其中(field = search1,field = search2)

时间:2016-01-02 14:11:29

标签: sql database-design

PatientDX

Name   Disease
Aa      HIV
Aba     DM
Bb      HT
Bb      DM
Aa      HT

我希望获得同时患有HIV,DM或所有疾病或类似疾病的患者姓名。我想通过UI中的疾病复选框进行分析。我该怎么做?我的桌子设计不好吗?你能告诉我一个更好的方法吗?疾病名称可以多达100个。因此,我希望能够轻松找出患有特定疾病的患者,4或5等等。谢谢。

2 个答案:

答案 0 :(得分:0)

尝试按用户分组,然后在查询中使用having子句。因此,要找到患有多种疾病的患者,您可以查询:

SELECT NAME
FROM PatientDX
GROUP BY NAME
HAVING COUNT(DISTINCT Disease) > 1

如果您想了解患有所有疾病的患者,那么您可以做以下事情:

SELECT NAME
FROM PatientDX
GROUP BY NAME
HAVING COUNT(DISTINCT Disease) = (SELECT COUNT(DISTINCT Disease)
                                  FROM PatientDX)-- although you could maintain disease in another table.

答案 1 :(得分:0)

您的架构很好。

以下是如何查询患有所有3种特定疾病的患者的示例:

select Name
from PatientDX
where Disease in ('HIV', 'DM', 'HT')
group by Name
having count(distinct Disease) = 3

这里需要注意的一些重要事项:

  • 我们在distinct子句中使用having来确保如果只传递了'HIV' 3次(我假设您将使用参数化查询),我们就不会得到一个结果。
  • 您要比较的值count(在本例中为3)必须与in子句中的值数相匹配。
  • IN子句中的值列表在计算之前必须是唯一的。