다음과 같은 테이블 구조가 있습니다.
person (pid, pname)
personSamples(sid,pid,sampleName)
groups(gid,groupName)
groupPersons(gpid,gid,pid)
grouppersonSamples(gpsid,gid,sid)
한 사람이 그룹 (즉, groupPersons
테이블) 에 추가 될 때마다 , 나는 테이블에 몇 가지 선택된 사람 샘플을 추가 grouppersonSamples
합니다.
요구 사항은 행을 삽입하지 않으면 주어진 사람과 그룹에 대해 grouppersonSamples
모두 선택하는 것 personSamples
입니다.
내가해야 할 일은 조인 하고 grouppersonSamples
일치하는 행이 없는지 확인한 grouppersonSamples
다음 다른 쿼리를 실행 personSamples
하여 주어진 pid에 대해 모두 선택하는 것 입니다.
모든 것을 단일 쿼리로 가져올 수있는 방법이 있습니까?
다음 쿼리는 grouppersonSamples 테이블에 아직없는 특정 person (pid)에 대한 group-person-samples (gid, sid)를 제공합니다.
주어진 사람의 pid가 3이라고 가정합니다. 나는이 사람이 추가 된 그룹의 gid를 고려하지 않았습니다. 특정 그룹을 고려하려면 pid = 3 조건과 유사한 다음 쿼리에 gid 필터를 추가하십시오.
select T1.gid, T1.sid from
(select gid, sid from groupPersons, personSamples where groupPersons.pid = personSamples.pid and groupPersons.pid = 3) as T1
LEFT JOIN
(select grouppersonSamples.gid, grouppersonSamples.sid from personSamples, groupPersons, grouppersonSamples where personSamples.pid = 3 and personSamples.pid = groupPersons.pid and grouppersonSamples.gid = groupPersons.gid and grouppersonSamples.sid = personSamples.sid) as T2
ON T1.gid = T2.gid and T1.sid = T2.sid where T2.gid IS NULL;
첫 번째 쿼리는 주어진 사람 (예 : pid = 3)에 대해 가능한 모든 group-person-samples (gid, sid)를 추출하고 두 번째 쿼리는 주어진 person에 대한 grouppersonSamples 테이블에있는 모든 group-person-samples (gid, sid)를 추출합니다.
그런 다음 LEFT JOIN은 MINUS 연산으로 작동하고 grouppersonSamples 테이블에 아직 존재하지 않는 주어진 사람에 대한 group-person-samples (gid, sid)를 제공합니다.
또한 다음과 같이 insert 문에서 위의 쿼리를 사용할 수 있습니다.
insert into grouppersonSamples(gid, sid) (<above query>);
추신 : Mysql이 MINUS 연산자를 지원하지 않기 때문에 LEFT JOIN을 사용하여 마이너스 연산을 수행했습니다. DBS가 지원하는 경우 MINUS 연산자를 직접 사용할 수 있습니다.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다