2015-01-21 3 views
-1

두 테이블, 환자 및 보험이 있습니다. 각 환자는 여러 보험에 가입 할 수 있으므로 각각의 환자와 보험을 각각 다른 행에 가져와 JSON 배열에 넣을 수 있습니다. 예 :MySQL은 각 레코드에 대해 여러 레코드를 검색합니다.

{ 
    patient: John, 
    address: apple, 
    race: white 
    insurances: // array of insurances for this patient 
} 

PHP에서 각 환자를 검색해야하며 ID를 사용하여 각 보험 기록을 수집해야합니까? 각 환자 기록에 속한 행 그룹마다 MySQL에서 배열을 검색하는 더 빠른 방법이 있습니까? 다들 감사 해요.

환자는

-----+---------+------+------------ 
name | address | race | insuranceID 
-----+---------+------+------------ 
john | apple | white| 1 
-----|---------|------+------------ 
mary | jane | asian| 2 
-----|---------|------+------------ 
sally| kay  | black| 3 

보험은

----+------+---------+------ 
id | name | address | type 
----+------+---------+------ 
    1 | edna | 112 n | P 
----+------|---------|------ 
    2 | maid | 45 st | I 
----+------|---------|------ 
    3 | mcare| 1235 | P 

참고 내가 이미 가지고있는 고정하지, 구현 아이디어를 찾고, 나는 ...을 아무것도

환자와 보험 사이의 많은 관계에 많은있을 경우
+0

환자 및 보험 테이블은 어떻게 링크됩니까? – Codeek

+2

시도한 것을 공유하십시오. –

+0

적어도 조인은 내가 생각하는 것입니다. – Bono

답변

2

대상 데이터 구조는 PHP 배열로 보입니다. 각 요소 자체는 환자를 설명하는 배열 인 patients이라고합시다.

MySQL은 제쳐 놓고, 당신과 같이 PHP이 할 것 :

$patients = array(); 
/* for each patient */ 
    $patient = array(); 
    $patient[name] = 'john'; 
    $patient[address] = '123 apple'; 
    $patient[race] = 'caucasian'; 
    /* for each payer for that patient */ 
    $insurance = array(); 
    $insurance[name] = 'edna'; 
    $insurance[type] = 'P'; 
    $patient[insurances[]] = $insurance; 
    $patients[] = $patient; 
/* now you can json encode the result */ 
$jpatient = json_encode($patients); 

그래서 여기에 트릭은 MySQL의 결과가이 코드에 for each patientfor each payer에 맞게 설정 얻을 것입니다.

당신은 쿼리를 실행하여

SELECT p.id, p.name, p.address, p.race, 
     i.id payerid, i.name payername, i.type payertype 
    FROM patients p 
    JOIN insurances i ON p.id = i.patient_id 
ORDER BY p.id, i.id 

이 각 납세자에 대한 하나의 행으로 당신에게 결과 집합을 줄 것이다라고 그렇게 할 것입니다. 환자가 두 명 이상의 지불자를 보유하고 있으면 환자의 데이터가 반복됩니다 (연속 행). 따라서 PHP 코드에서 환자 ID가 변경되면이를 탐지해야합니다.

이렇게 보입니다. (사과 드리며, 디버깅 할 시간이 없다.)

$patients = array(); 
$patient = false; 
$previousid = -1; 
while ($row = $resultset->fetch_assoc()) { 
    if ($row[id] != $previousid) { 
    /* this is a new patient */ 
    if (!empty($patient)) { 
     /* we were already accumulating data for a patient */ 
     $patients[] = $patient; 
     $patient = false; 
     $previousid = $row[id]; 
    } 
    } 
    if (empty ($patient)) { 
    /* we need to start a new patient data structure */ 
    $patient = array(); 
    $patient[name] = row[name]; 
    $patient[address] = row[address]; 
    $patient[race] = row[race]; 
    } 
    $insurance = array(); 
    $insurance[name] = $row[payername]; 
    $insurance[type] = $row[payertype]; 
    $patient[insurances[]] = $insurance; 
} /* end while fetch_assoc() */ 
if (!empty($patient)) { 
    /* output last patient if any */ 
    $patients[] = $patient; 
} 
+0

그러나 좋은 해결책은 검색 할 수있는 엄청난 양의 중복 데이터입니다. – user3704920

+0

보통 중첩 된 쿼리를 실행하는 것보다 단일 쿼리를 실행하고 중복 된 데이터 만 처리하는 것이 더 좋습니다. 그것은 확실히 훨씬 더 잘 수행 할 것입니다. 또한 데이터 처리에서 우리는 * huge *라는 단어가 1 천만 행 이상을 의미하는 것으로 보류합니다. –

+0

@ user3704920 당신은 성능 문제가 없다는 것을 상상하고 있습니다. 중첩 된 쿼리는 중복 된 데이터보다 훨씬 비쌉니다. 특히 대부분의 환자가 12 개 미만의 보험에 가입해야합니다. 그것은 완벽하게 최적은 아니지만 솔직히 실제로는 중요하지 않습니다. –

0

나는 한 번 더 테이블이라고 Patient_Insurance를 추가하고 그 링크 테이블이 될 수 있도록 것입니다 : 다음

---+------+ Pid| Iid | ----+------+ 1 | 1 | ----+------| 1 | 2 | ----+------| 2 | 1 |

내가 달성하기 위해 상상하는 가장 빠른 방법 당신이 원하는 것은 Patient_Insurance에서 사용자 ID를 찾고 Insurances 데이터에 가입함으로써 Patient 배열에 Patient 배열을 채우고 배열을 반복하고 Insurances를 채 웁니다.

하나의 쿼리로 원하는 결과를 얻지 못할 수도 있습니다.

+0

그래서 100 명의 환자가 있으면 100 개의 검색어를 실행하게됩니까? – user3704920

+0

무엇? 일대 다 관계가있는 경우 세 번째 테이블이 필요 없으며 '보험'테이블에 'PatientID'만 있습니다. 다 대다 관계에 대한 올바른 설정을 설명하고 있습니다. 또한 단일 쿼리로 모든 결과를 얻을 수 있습니다. –

+0

당신은 맞습니다. 나는 많은 관계를 묘사했는데 그것은 제 실수였습니다. 어쩌면 당신은 질의를 제공 할 수 있습니까? –

0

여기는 SQLFiddle of what you want입니다. 그것은 단지 일반적인 근사치이며 모든 필드를 포함하지 않았거나 기본 키, FK 등을 설정하지 않았다는 점에 유의하십시오.

SELECT p.id, p.name, 
     i.id insuranceID, i.address 
    FROM Patient p 
    JOIN Insurance i ON p.id = i.PatientID 
ORDER BY p.id, i.id 

얻을 :

create table Patient (id int, name varchar(20)); 
create table Insurance (id int, address varchar(100), PatientID int); 

그럼 당신은 등을 조회 할 수 있습니다

"다"테이블 (보험) PatientID있는 "한"테이블 (환자)에 대한 참조를 필요 :

ID NAME INSURANCEID  ADDRESS 
1 bob  1    1 main st 
1 bob  2    1 left st 
1 bob  3    1 right st 
3 joe  4    joe lives here 
3 joe  5    joe other house 
+0

고마워요.하지만 다시 문제는이 데이터를 매우 느린 응용 프로그램으로 만드는 중복 된 데이터의 양에 있습니다. 나는 다른 방법을 사용해야 할 것 같아. – user3704920

관련 문제