2011-09-07 74 views
1

我正在编写能够检查同一用户的多行的查询。如果同一用户记录的组合不能提供我需要的信息(请记住它是用户拥有的所有记录的组合,而不是一个记录),则认为用户已通过。如何选择多行的组合(MySQL)

例如:有两个表格。

一种是“用户”,它保留用户的个人信息:

id client_id first_name last_name date_of_birth ssn address 

另一种是“筛选”,这使用户的医疗测试信息:

id user_id date cholesterol ldl hemoglobin triglycerides mcv glucose 
mchc ha1c plateletcount. 

一个用户只能有一个记录在用户表中,但在筛选表中可能有多个记录。我想要做的是检查属于同一用户的用户的多个筛选记录,看看这些记录的组合是否提供了我需要的必要信息。如果否,则选择用户。例如,必要的信息包括胆固醇,ldl,甘油三酯,葡萄糖或。如果用户有两个筛选记录,一个记录提供cholesterol(NOT NULL),另一个提供triglycerides(NOT NULL),glucose(NOT NULL)ha1c(NOT NULL)。他被选中是因为ldl缺失。

如何编写能够做到这一点的查询?我尝试了内部连接,但似乎不起作用。这里有一些要求。对于胆固醇,ldl和甘油三酯,只要其中一个缺失,应该选择用户。但是对于葡萄糖和ha1c,仅当两者都缺失时才选择用户。

一个我想查询的是这样的:

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, group_concat(screening.glucose), group_concat(screening.ha1c) 
    FROM users 
    INNER JOIN clients 
    ON(
     users.client_id = clients.id 
     ) 
    INNER JOIN hra 
    ON(
     users.id = hra.user_id 
     AND hra.date BETWEEN '2011-07-01' AND '2011-11-15' 
     AND hra.maileddate IS NOT NULL 
     ) 
    LEFT JOIN screening 
    ON(
     users.id = screening.user_id 
    AND screening.date BETWEEN '2011-05-15' AND '2011-11-15' 
    AND screening.maileddate IS NULL 
    AND (screening.cholesterol IS NULL 
     OR screening.ldl IS NULL 
     OR screening.triglycerides IS NULL) 
    AND screening.glucose IS NULL 
    AND screening.ha1c IS NULL 
    AND (screening.weight IS NULL 
     OR screening.systolic IS NULL 
     OR screening.diastolic IS NULL) 
    ) 
    WHERE users.client_id = '1879'  


    GROUP BY users.id 
+0

您只关心筛选记录是否为“NOT NULL”,或者您是否真的需要其内容?因为您总是可以将Users表留给加入子查询的用户ID的Screening表,并获得每个其他字段的MAX。如果该UserID的所有记录都为NULL,则它将仅返回一个NULL字段。这会满足吗? – mwan

+0

[如何检查多行记录组合(MySQL)]的可能的重复](http://stackoverflow.com/questions/7335781/how-to-check-combination-of-records-from-multiple-rowsmysql) –

回答

0

我认为你必须去与在WHEREEXISTS()子查询。像

SELECT ... 
FROM users 
INNER JOIN clients ON(users.client_id = clients.id) 
INNER JOIN hra ON(...) 
WHERE users.client_id = '1879' 
    AND(EXISTS(SELECT 1 FROM screening WHERE(users.id = screening.user_id)AND(...))) 

NOT EXISTS,这取决于你如何编写你的标准。