【问题标题】:return records from 53 tables mysql database with p_id and t_id?使用 p_id 和 t_id 从 53 个表 mysql 数据库返回记录?
【发布时间】:2014-02-07 19:56:02
【问题描述】:

我在 mysql 数据库中有 53 个表,其中所有表都具有相同的 pid(患者 ID)=> 患者表中的主键字段。当用户保存测试信息时,它可能与它的其他属性以及 pid 一起保存。 我的问题是我试图找出当打印机用户尝试打印该患者的测试结果时,我将如何使用 sql 查询向他展示该患者的测试结果。 另一件事,我还在每个表中保存 t_id => test id,其中 t_id 是测试表中的主键字段,并且还有当前日期(YYYY-mm-dd)。 有什么想法吗?

【问题讨论】:

  • 为什么你有 53 个表而不是 1 个?
  • 我的数据库存储了不同的医学测试,每个测试的结果都有一个表,因为每个测试的字段都与其他测试不同。比如血糖测试具有与尿常规检查不同的属性等等......并且每个患者一次可能进行多个测试。
  • 我明白了,但是你不能为每个新测试创建一个新表——这太荒谬了!虽然我不敢这么说,但我认为 EAV 模型在这里可能是合适的,但它可以正确利用数据类型。

标签: php html mysql database join


【解决方案1】:

我用下面的代码解决了我的问题:

.
.
.
<?php 
$p_sno = addslashes($_POST['p_sno']);
$date = addslashes($_POST['date']);
//print_r($_POST);
$counter = 0;
$sqlTables = "SELECT DISTINCT table_name FROM information_schema.columns WHERE column_name ='p_sno'";
foreach($crud->getRecordSet($sqlTables) as $tables){
//echo($tables['table_name'].'<br />');
$tbl = $tables['table_name'];
$sqlPickRecord = "SELECT sno,date_time,t_sno FROM $tbl WHERE p_sno = $p_sno AND STR_TO_DATE(date_time,'%Y-%m-%d') = '".$date."'";
foreach($crud->getRecordSet($sqlPickRecord) as $row){ $counter +=1; 
$pat_name_sql = "SELECT patient_name FROM patient_info WHERE sno = '".$p_sno."'";
$pat_name = $crud->getValue($pat_name_sql,"patient_name");
$test_name_sql = "SELECT test_name FROM test_info WHERE sno = '".$row['t_sno']."'";
$test_name = $crud->getValue($test_name_sql,"test_name");
?>
    <tr>
        <td> <?php echo($counter); ?> </td>
        <td> <?php echo($p_sno); ?> </td>
        <td> <?php echo($pat_name); ?> </td>
        <td> <?php echo($test_name); ?> </td>
        <td> <?php echo($row['date_time']); ?> </td>
        <td> <a target="_blank" class="print_btn" href="print_<?php echo(str_replace(" ","_",$test_name)); ?>.php?tbl=<?php echo($tbl); ?>&p_sno=<?php echo($p_sno); ?>&t_sno=<?php echo($t_sno);?>&date=<?php echo($row['date_time']);?>" title="Print Test Result"> Print </a> </td>
    </tr>
    <?php } 
}
     }
}//search button 
?>
.
.
.
.

它现在对我有用。

【讨论】:

    【解决方案2】:

    您在这里遇到了一个具有挑战性的问题,因为 SQL 查询的结果集本质上是数据的矩形。也就是说,结果集中的每一行都具有与其他行相同的列。然而,医学测试不是这样工作的。有些有几个数字。其他人有一些文字信息。其他包含非常密集的数据痕迹(EKG),或者可能是图像(X射线)。 SQL 是 IT 的Procrustean Bed。它希望一切都一样。

    如果您必须使用纯 SQL 的单个查询来生成此报告,那么您在此设计中的第一步是尝试想象如何强制(格式化)每个不同的测试结果以适应标准化的行。

    完成此操作后,您就可以编写 SQL 代码来为每个测试表进行格式化。此 SQL 代码可能包含对CONCAT()CONCAT_WS() 函数的大量调用。例如,您可能在其中一个查询中有类似的内容。

    CONCAT('HDL: ','ch.hdl,' LDL: ', ch.ldl) AS result
    

    (@Strawberry 会打电话给我kafir 建议你使用这些功能。)

    然后,最后,您可以考虑将所有这些函数组合成一个 57 路 UNION ALL 查询,包装在一个按适当值排序的查询中,可能是测试时间戳。

    您可以这样做,但您的工作产品将是一个巨大的查询。会很难维护。 “毛球”是最好的词。

    您可能应该考虑改为在 PHP 代码中创建报告。从返回这样一个简单结果集的查询开始,以正确顺序提供测试列表。

     p_id, t_id, test_type, timestamp
    

    然后循环这个结果集并查询每个单独的测试表。编写一个 PHP 函数(或者可能是一个 PHP 类)来处理各种测试。使用 PHP 代码格式化您的报告。

    最重要的是,要有耐心。认真思考一下应用程序构建这些数据的最佳方式是一个好主意。这种工作很难而且很费时间才能做好。取得好成绩的方法有很多,但没有一个是神奇的。

    【讨论】:

    • 我真的很喜欢你的第二个想法,但我至少需要写下 53 个查询,不是吗?
    • @AbdulRahman,是的,您需要编写许多查询。但是,您需要为第一个选项编写类似数量的 SQL;它只会被塞进一个查询中。
    • 我过去在 sql server 数据库中使用过一个存储过程,其中我在单个数据库的所有可用表中搜索了一个文本。有没有用mysql运行的选项?
    • 是的,确实,您可以在 MySQL 中使用存储过程和/或函数。您也可以使用视图。
    猜你喜欢
    • 1970-01-01
    • 2019-03-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多