我有两张桌子,病人和保险。每个患者可以有几个保险,所以我需要在不同的行中检索每个患者和他们的每个保险,这样我就可以将它们放在JSON
阵列中。例如:
{
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 :(得分:2)
您的目标数据结构似乎是一个php数组,我们称之为patients
,其中每个元素本身就是一个描述患者的数组。
$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 patient
和for 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;
}
答案 1 :(得分:0)
如果患者和保险之间存在多对多的关系,我会再添加一个名为Patient_Insurance的表,并将其作为链接表:
---+------+
Pid| Iid |
----+------+
1 | 1 |
----+------|
1 | 2 |
----+------|
2 | 1 |
然后我想象的最快的方法就是通过从患者中选择所有来填充您的Patient阵列,然后通过在Patient_Insurance中查找用户ID并加入Insurances数据来遍历该阵列并填充保险。
您只需一次查询就无法获得所需的结果。
答案 2 :(得分:0)
这是一个有效的SQLFiddle of what you want。请注意,这只是一般性的近似,我没有包括所有字段或设置主键,FK等。
"很多" table(保险)需要参考" one"表(患者)是PatientID
:
create table Patient (id int, name varchar(20));
create table Insurance (id int, address varchar(100), PatientID int);
然后你可以查询:
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
得到:
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