如果行共享相同的ID,则将行附加在一起

时间:2018-11-13 13:03:18

标签: php mysql

我有一个病人数据库,病人可以得到零个或与病人一样多的诊断。

我的目标是显示所有具有所有诊断的患者列表,每个患者及其诊断仅一行。

由于前开发人员的数据库结构,当我进行所需的SQL查询时,每次诊断患者都会得到一行。 有2个诊断的患者示例: enter image description here

我的问题是,这两种诊断是否有可能因为它们具有相同的ID而位于同一行。所以我所有患者的名单只包含一行。患者。

我在用PHP输出数据时标记了PHP以及MYSQL,我想也许可以在PHP中完成(如果不能在SQL中完成)?

这是我用来向患有两次诊断的病人展示的查询。我使用相同的查询来显示所有患者,只是选择了更多的列,而没有WHERE语句。

SELECT `DK Diagnoses`.`No`,`DK Diagnoses`.`EMGDiagText`
FROM `DK Diagnoses`
JOIN `PATIENTINFO` ON `DK Diagnoses`.`No` = `PATIENTINFO`.`Exam`
JOIN `SEXCODE` ON `PATIENTINFO`.`Sex` = `SEXCODE`.`SexCode`
JOIN `PROBABILITYCODE` ON `DK Diagnoses`.`Prob` = `PROBABILITYCODE`.`Code`
JOIN `EXAMINFO` ON `PATIENTINFO`.`Exam` = `EXAMINFO`.`Exam`
JOIN `REFTYPE` ON `EXAMINFO`.`RefSource` = `REFTYPE`.`Refsource`
WHERE `DK Diagnoses`.`LabCode` = "Gold" AND  `DK Diagnoses`.`No` = 2598
ORDER BY `DK Diagnoses`.`No` DESC

3 个答案:

答案 0 :(得分:0)

您可以使用group by和group_concat

SELECT `DK Diagnoses`.`No`,GROUP_CONCAT(`DK Diagnoses`.`EMGDiagText`)
FROM `DK Diagnoses`
JOIN `PATIENTINFO` ON `DK Diagnoses`.`No` = `PATIENTINFO`.`Exam`
JOIN `SEXCODE` ON `PATIENTINFO`.`Sex` = `SEXCODE`.`SexCode`
JOIN `PROBABILITYCODE` ON `DK Diagnoses`.`Prob` = `PROBABILITYCODE`.`Code`
JOIN `EXAMINFO` ON `PATIENTINFO`.`Exam` = `EXAMINFO`.`Exam`
JOIN `REFTYPE` ON `EXAMINFO`.`RefSource` = `REFTYPE`.`Refsource`
WHERE `DK Diagnoses`.`LabCode` = "Gold" AND  `DK Diagnoses`.`No` = 2598
GROUP BY `DK Diagnoses`.`No`
ORDER BY `DK Diagnoses`.`No` DESC

但是我建议您使用PHP进行此操作,因为您在那里更加灵活。就像在列表中显示诊断,而不是仅用逗号分隔。

答案 1 :(得分:0)

我建议您使用GROUP_CONCAT。它将DK Diagnoses表中具有相同NO的所有多条记录合并为一行,并使用特定的分隔符,如下所示:

SELECT `DK Diagnoses`.`No`, GROUP_CONCAT(`DK Diagnoses`.`EMGDiagText` separator '-[!$!]-') AS `EMGDiagText`
FROM `DK Diagnoses`
JOIN `PATIENTINFO` ON `DK Diagnoses`.`No` = `PATIENTINFO`.`Exam`
JOIN `SEXCODE` ON `PATIENTINFO`.`Sex` = `SEXCODE`.`SexCode`
JOIN `PROBABILITYCODE` ON `DK Diagnoses`.`Prob` = `PROBABILITYCODE`.`Code`
JOIN `EXAMINFO` ON `PATIENTINFO`.`Exam` = `EXAMINFO`.`Exam`
JOIN `REFTYPE` ON `EXAMINFO`.`RefSource` = `REFTYPE`.`Refsource`
WHERE `DK Diagnoses`.`LabCode` = "Gold" AND  `DK Diagnoses`.`No` = 2598
GROUP BY `DK Diagnoses`.`No`
ORDER BY `DK Diagnoses`.`No` DESC

在这里,将多个记录合并为一个的键是-[!$!]-。因此,现在,与唯一患者总数相比,您将获得相同数量的记录,但是他们的多次诊断将被分组为一个长字符串,通过-[!$!]-键进行联系。

您可以遍历记录以打印所有唯一的患者,并且在打印EMGDiagText时仅通过指定键explode(),然后再次遍历。例如

foreach($result as $row){
    echo '<tr><td>Patient no:- '. $row['No'] . '</td>';
    $diags = explode('-[!$!]-', $row['EMGDiagText']);
    if(!empty($diags)){
        echo '<td><table>';
        foreach($diags as $key => $data){
            echo '<tr><td>Diagnoses ' . ($key+1) . '). ' . $data . '</td></tr>';
        }
        echo '</table></td>';
    } else {
        echo '<td>No Diagnoses</td>';
    }
    echo '</tr>';
}

希望,它将帮助您并解决您的问题。

答案 2 :(得分:-1)

对我来说,最简单的方法就是这样。

SELECT No, GROUP_CONCAT(EMGDiagText) FROM diagnoses GROUP BY No;

我希望这会有所帮助。