2011-09-07 47 views
1

我正在編寫能夠同時檢查多行的查詢。如果同一用戶記錄的組合提供了我需要的足夠信息,即使每一條記錄都沒有提供我需要的足夠信息,用戶也會被認爲已通過。如何檢查多行記錄的組合(MySQL)

例如: 有兩個表格。

一種是「用戶」,它保留用戶的個人信息:
ID CLIENT_ID LAST_NAMEFIRST_NAME您好DATE_OF_BIRTH SSN解決

另一個是「實驗室」,它使用戶的醫療測試信息: ID external_source_id user_ID的日期白細胞紅細胞血紅蛋白hematocrit mcv mch mchc rdw plateletcount

一位用戶只能在用戶表中有一條記錄,但在實驗室表中可能有多條記錄。我想要做的是檢查屬於同一用戶的用戶的多個實驗室記錄,看看這些記錄的組合是否提供了我需要的必要信息。如果是,則即使任何單個實驗室記錄不能提供足夠的信息,也會通過該用戶。例如,必要的信息包括膽固醇,ldl,甘油三酯,葡萄糖。如果用戶有兩個實驗室記錄,一個記錄提供膽固醇(NOT NULL)和ldl(NOT NULL),另一個提供甘油三酯(NOT NULL),葡萄糖(NOT NULL)。他被認爲通過了。

如何編寫能夠做到這一點的查詢?

我目前擁有的查詢是這樣的:

SELECT users.id AS user_id, users.first_name, users.last_name, clients.name AS client, 
     users.social_security_number AS ssn, users.hiredate, hra.id AS hra_id, hra.date  AS hra_date, hra.maileddate AS hra_maileddate, 
     screening.id AS screening_id, screening.date AS screening_date, screening.maileddate AS screening_maileddate 
     FROM users 
     INNER JOIN clients 
     ON(
      users.client_id = clients.id 
      ) 
     INNER JOIN hra 
     ON(
      users.id = hra.user_id 
      ) 
     LEFT JOIN labs 
     ON(
      users.id = labs.user_id 
     ) 
     WHERE users.client_id = '1879'  
     AND hra.date BETWEEN '2011-07-01' AND '2011-11-15' 
     AND hra.maileddate IS NOT NULL 
     AND labs.date BETWEEN '2011-05-15' AND '2011-11-15' 
     AND labs.maileddate IS NULL  
     AND labs.cholesterol IS NOT NULL 
     AND labs.ldl IS NOT NULL 
     AND labs.triglycerides IS NOT NULL 
     AND (labs.glucose IS NOT NULL OR labs.ha1c IS NOT NULL) 
     GROUP BY users.id 

回答

1

這將在您的例子選擇所有用戶

select u.* 
from user u 
join lab l1 on l1.user_id = u.id and l1.wbc is not null 
join lab l2 on l2.user_id = u.id and l2.hemoglobin is not null 
join lab l3 on l3.user_id = u.id and l3.plateletcount is not null 
-- etc for other fields that need to be not null 

這會工作,即使相同的記錄有一個以上的所需的列,或者如果這些值跨行分佈。

如果你想Lab值也只是select u.*, l1.wbc, l2.hemoglobin, ... etc

+0

+1,打我吧。 – Johan

+0

感謝您的回覆。但如果我想要(wbc不爲空)或(血紅蛋白不爲空)或(plateletcount不爲空) –

0

如果你想誰傳的用戶:

您可以使用與AND子句

Select u.* from user u 
where 
u.user_id in (select user_id from lab where wbc is not null) and 
u.user_id in (select user_id from lab where hemoglobin is not null) and 
u.user_id in (select user_id from lab where plateletcount is not null); 

,如果你希望用戶誰不合格

您可以使用帶有OR子句的IN

Select u.* from user u 
where 
u.user_id in (select user_id from lab where wbc is null) OR 
u.user_id in (select user_id from lab where hemoglobin is null) OR 
u.user_id in (select user_id from lab where plateletcount is null); 

我希望有道理:)

+0

我試圖根據您的想法編寫查詢,但mysql進程崩潰。我認爲它效率不高,我的查詢已經非常複雜。 –