2011-09-08 57 views
0

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

例如:有两个表格。

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

ID CLIENT_ID LAST_NAMEFIRST_NAME您好DATE_OF_BIRTH SSN解决 另一种是“筛选”,这使用户的医疗测试信息:

ID user_ID的日期胆固醇LDL血红蛋白甘油三酯mcv葡萄糖 mchc ha1c血小板计数。 一个用户只能在用户表中有一条记录,但在筛选表中可能有多条记录。我想要做的是检查属于同一用户的用户的多个筛选记录,看看这些记录的组合是否提供了我需要的必要信息。如果否,则选择用户。例如,必要的信息包括胆固醇,ldl,甘油三酯,葡萄糖或。如果用户有两个筛选记录,一个记录提供胆固醇(NOT NULL),另一个提供甘油三酯(NOT NULL),葡萄糖(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, 
     sall.id AS screening_id, sall.date AS screening_date, sall.maileddate AS  screening_maileddate 
    FROM users 
    INNER JOIN clients 
    ON(
     users.client_id = clients.id 
     AND users.client_id = '1879' 
     ) 
    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 
     ) 
    INNER JOIN screening sall 
    ON(
    sall.user_id = users.id 
    ) 
     INNER JOIN screening s1 
     ON(
     s1.user_id = users.id 

     AND s1.date BETWEEN '2011-05-15' AND '2011-11-15' 
    ) 
    INNER JOIN screening s2 
    ON(
     s2.user_id = users.id 

     AND s2.date BETWEEN '2011-05-15' AND '2011-11-15' 
    ) 
    INNER JOIN screening s3 
    ON(
     s3.user_id = users.id 

     AND s3.date BETWEEN '2011-05-15' AND '2011-11-15' 
    ) 
    INNER JOIN screening s4 
    ON(
     s4.user_id = users.id 

     AND s4.date BETWEEN '2011-05-15' AND '2011-11-15' 
    ) 
    INNER JOIN screening s5 
    ON(
     s5.user_id = users.id 

     AND s5.date BETWEEN '2011-05-15' AND '2011-11-15' 
) 
    INNER JOIN screening s6 
    ON(
     s6.user_id = users.id 

     AND s6.date BETWEEN '2011-05-15' AND '2011-11-15' 
) 

    WHERE ((s1.cholesterol IS NULL 
    OR s2.ldl IS NULL 
    OR s3.triglycerides IS NULL) 
    OR (s4.glucose IS NULL 
    AND s5.ha1c IS NULL)) 
    AND s6.maileddate IS NULL 
    GROUP BY users.id 
+0

可能重复[如何选择多行(MySQL的)组合(http://stackoverflow.com/questions/ 7341090/how-to-select-the-combination-of-multiple-rowsmysql) –

回答

1

你不想内连接,你想要左连接。当任何连接条件失败时,内部联接会抑制结果行,而左侧联接允许结果行显示为空项。

你离这里很近。

+0

即使使用INNER JOIN,它仍显示一些不应显示的结果 –

1

你真的必须做所有内部联接的筛选吗?考虑这个(这不是一个完整的查询,但建议不同的筛选方法:)

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, 
    sall.id AS screening_id, sall.date AS screening_date, sall.maileddate AS  screening_maileddate 
FROM users 
LEFT JOIN clients 
ON(
    users.client_id = clients.id 
    AND users.client_id = '1879' 
) 
LEFT 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 sall 
ON(
    sall.user_id = users.id 
) 
WHERE users.id NOT IN 
(
    SELECT user_id FROM screening1 
    WHERE user_id = users.id AND 
     colesterol IS NULL 
     date BETWEEN '2011-05-15' AND '2011-11-15' 
) 
OR users.id NOT IN 
(
    SELECT user_id FROM screening2 
    WHERE user_id = user.id AND 
     ldl IS NULL 
     date BETWEEN '2011-05-15' AND '2011-11-15' 
) 
...