【问题标题】:What's the most efficient way to pull the data from mysql so that it is formatted as follows:从mysql中提取数据的最有效方法是什么,使其格式如下:
【发布时间】:2011-03-21 20:48:40
【问题描述】:

我有一个包含患者信息(姓名、出生日期、社会保险号码等)的表格和一个包含他们服用的药物列表的表格。 (阿司匹林、克拉里汀等)这些表通过患者表中的唯一 ID 相关联。因此,取出 Mary Smith 的所有药物很容易。

但是,我需要做的是显示一个分页的患者列表,其中显示了他们的姓名、患者表中的其他内容,并有一列以行分隔的药物列表。粗略地说,这是:

如果我做一个简单的左连接,我会得到 3 行重复的 Mary Smith,每行一种药物。

患者表可以有数千条记录,因此我不想进行查询以获取所有患者,然后循环遍历并获取他们的药物。而且,因为它是根据患者分页的,所以我无法弄清楚如何为该页面获取正确数量的患者以及他们所有的药物。

(患者/药物只是数据的一个粗略示例;因此请不要建议重组数据的存储方式。)

【问题讨论】:

    标签: php mysql performance


    【解决方案1】:

    GROUP_CONCAT 来救援!

    SELECT patients.first_name, patients.last_name, GROUP_CONCAT(prescriptions.medication SEPARATOR ", ") AS meds FROM patients LEFT JOIN prescriptions ON prescriptions.patient_id = patients.id GROUP BY patients.id;
    

    【讨论】:

    • 不错!我不知道GROUP_CONCAT。我会记住这个,以备不时之需。为你 +1
    • 完美!谢谢你。如果您不知道其中一些内容的术语,那么找到答案可能会很困难。
    • 没有问题,艾米。我完全理解。大多数人可能也不知道这个聚合函数。
    【解决方案2】:

    你有几个选择。

    1. rowspan 条款,每个用户每个单元格一种药物。您需要运行两个 SQL 查询来预先计算每个用户的跨度必须有多大,或者将查询结果吸入 PHP 并在那里进行计数。
    2. 简单的状态机 - 每次用户更改时开始一个新行,然后在用户名保持不变的情况下继续添加更多以<br /> 分隔的药物名称。

    第二个可能最简单:

    $previous_name = null;
    $first = true;
    
    echo "<table";
    
    while($row = mysql_fetch_assoc($results)) {
         if ($row['name'] <> $previous_name) {
             if (!$first) {
                 echo "</td></tr>"; // end previous row, if it's not the first row we've output
                 $first = false;
             }
             echo "<tr><td>$row[name]</td><td>"
             $previous_name = $row['name'];
         }
         echo "$row['drug']<br />";
    }
    echo "</td></tr></table>";
    

    【讨论】:

      【解决方案3】:

      【讨论】:

        猜你喜欢
        • 2013-03-07
        • 2016-09-05
        • 1970-01-01
        • 2023-03-20
        • 2020-01-16
        • 1970-01-01
        • 1970-01-01
        • 2016-09-02
        • 1970-01-01
        相关资源
        最近更新 更多