[英]MySQL join multiple rows from one table while selecting only a single row from the others
也许有点奇怪的标题描述,但我基本上想实现GROUP_CONCAT()
函数所做的事情,然后保留双重条目。
我有四张桌子我想加入, client
, doctor
, physio
和records
根据变量$client
我想获取客户详细信息、主治医生和治疗师(三个表中的一行)并加入该用户的所有记录。
假设在这种情况下$client = 1
。 records
表有五个记录,其中r_client_id = 1
列。 如果我运行如下查询,我只会从records
表中获取一条记录,即第一次出现r_client_id = 1
(这当然有意义):
SELECT
client.c_id, client.c_name
doctor.d_name,
physio.p_name,
records.r_record
FROM
adm_clients AS client
INNER JOIN
norm_client_doctor AS ncd ON ncd.ncd_client_id = client.c_id
INNER JOIN
adm_doctor AS doctor ON doctor.d_id = ncd.ncd_doctor_id
INNER JOIN
norm_client_physio AS ncp ON ncp.ncp_client_id = client.c_id
INNER JOIN
adm_physio AS physio ON physio.p_id = ncp.ncp_physio_id
LEFT JOIN
adm_doctor_records AS records ON records.r_client_id = client.c_id
WHERE
client.c_id = '".$client."'
现在假设r_client_id = 1
的五个记录是这样的:
+------+-------------+-------------------+----------+
| r_id | r_client_id | r_record | r_date |
+------+-------------+-------------------+----------+
| 1 | 1 | regular visit | 10/10/12 |
+------+-------------+-------------------+----------+
| 3 | 1 | emergency control | 24/10/12 |
+------+-------------+-------------------+----------+
| 7 | 1 | regular visit | 08/09/12 |
+------+-------------+-------------------+----------+
| 18 | 1 | delivery | 03/01/12 |
+------+-------------+-------------------+----------+
| 20 | 1 | health checkup | 10/12/11 |
+------+-------------+-------------------+----------+
我希望我的输出像这样在一个数组中:
Client 1
- Name Doctor
- Name Physio
Records
- Emergency control, 24/10/12
- Regular visit, 10/10/12
- Regular visit, 08/09/12
- Delivery, 03/01/12
- Health checkup, 10/12/11
我能GROUP_CONCAT()
的最接近的是在记录上添加一个GROUP_CONCAT()
,但是,当然,将“定期访问”分组,所以我会得到 4 行而不是 5
GROUP_CONCAT(DISTINCT records.r_record SEPARATOR '|')
[..]
echo(str_replace("|","<br>",$show->r_record));
有人知道如何显示所有匹配的记录吗? 我觉得我很接近,但我现在别无选择..
编辑:我忘了提到当我删除DISTINCT
,它会显示所有记录两次。
解决了:
让它像这样工作:
GROUP_CONCAT(DISTINCT
CONCAT (records.r_date, '~', records.r_record, '~', records.r_paraph)
SEPARATOR '|') AS clientDoctorRecords,
尝试:
SELECT
client.c_id, client.c_name
doctor.d_name,
physio.p_name,
GROUP_CONCAT(records.r_record)
FROM
adm_clients AS client
INNER JOIN
norm_client_doctor AS ncd ON ncd.ncd_client_id = client.c_id
INNER JOIN
adm_doctor AS doctor ON doctor.d_id = ncd.ncd_doctor_id
INNER JOIN
norm_client_physio AS ncp ON ncp.ncp_client_id = client.c_id
INNER JOIN
adm_physio AS physio ON physio.p_id = ncp.ncp_physio_id
LEFT JOIN
adm_doctor_records AS records ON records.r_client_id = client.c_id
WHERE
client.c_id = '".$client."'
GROUP BY
client.c_id
如果您希望r_date
与一列中的record
一起出现,那么您可以先使用普通CONCAT
,然后在其上执行GROUP_CONCAT
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.