繁体   English   中英

MySQL 连接一个表中的多行,而仅从其他表中选择一行

[英]MySQL join multiple rows from one table while selecting only a single row from the others

也许有点奇怪的标题描述,但我基本上想实现GROUP_CONCAT()函数所做的事情,然后保留双重条目。

我有四张桌子我想加入, clientdoctorphysiorecords

根据变量$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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM