2011-09-07 4 views
1

동시에 여러 행을 확인할 수있는 쿼리를 작성하고 있습니다. 동일한 사용자의 레코드 조합이 필요한 정보를 제공하는 경우 모든 단일 레코드로도 필 요한 정보가 충분하지 않아도 사용자는 통과 한 것으로 간주됩니다.여러 행의 레코드 조합 확인 방법 (MySQL)

예 : 두 개의 테이블이 있습니다.
ID CLIENT_ID LAST_NAMEFIRST_NAME 님 date_of_birth SSN 또 다른 하나는 사용자의 의료 테스트 정보를 보관 "실험실"입니다

주소 : ID external_source_id의 USER_ID 일 WBC 적혈구 헤모글로빈

하나는 사용자의 개인 정보를 보관 "사용자"입니다 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 

귀하의 예제에있는 모든 사용자를 선택합니다, 또는 값이 행 전체에 퍼져있는 경우.

너무 실험실 값을 원하는 경우에, 다만 select u.*, l1.wbc, l2.hemoglobin, ... etc

+0

+1, 저에게 이길 수 있습니다. – Johan

+0

답장을 보내 주셔서 감사합니다. 그러나 (wbc가 null이 아님) OR (헤모글로빈이 널이 아님) 또는 (plateletcount가 널이 아님) –

0

당신이 PASS 사용자하려는 경우 : 당신이 사용자가 원하는 경우

당신과 함께 IN을 사용할 수 있습니다 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 프로세스가 손상되었습니다. 나는 그것이 효율적이지 않고 내 쿼리가 이미 매우 복잡하다고 생각합니다. –

관련 문제