2011-09-07 3 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 및 트리글리 세라이드의 경우, 그 중 하나가 누락되어있는 한 사용자를 선택해야합니다. 그러나 글루코오스 및 인플루엔자에 대해, 사용자는 둘 다 누락 된 경우에만 선택된다. 내가 노력 쿼리의

하나는 다음과 같이이다 :

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'인지 아니면 실제로 내용을 원하십니까? 사용자 테이블을 UserID로 스크리닝 테이블을 그룹화하고 다른 모든 필드의 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과 같은 것.

관련 문제