从逗号分隔的 JSON mysql 字段查询报告

Posted

技术标签:

【中文标题】从逗号分隔的 JSON mysql 字段查询报告【英文标题】:Query Reports from comma separated JSON mysql field 【发布时间】:2019-08-18 21:42:47 【问题描述】:

这是我的第一个问题。如果我不符合要求的规则,请道歉。我已经尽力了,

问题-- 我对正在进行的项目有疑问。它是基于医学的。我有这三个表需要从中获取报告 数据库结构--

diseaseTable which has columns
diseaseID | diseaseName
diseaseID stores an integer i.e 1, 3, 4,..
dieseaseName stores name of disease e.g Hypertension, Malaria, ..e.tc

我也有 patientsTable,其中包含这些关键列

patientID - which is an autoincrement int
patientName - name of patient
created_at - date and time of registration of the patient

最后是治疗表,其中包含

treatmentID -autoincrement int
patient - contains the id of the patient which is a foreing key of patientsTable
created_at and updated_at for timestamps
diseaseTreated (which is my column of interest) Stores values in json comma separated fields. 

我已经检查了来自https://***.com/search?q=mysql+comma+separated+fields 的所有结果,但似乎没有一个可以解决我的问题。我已经检查了重组 mysql 架构的方法,但是我有太多的表来存储从每个患者身上诊断出的疾病。此外,一名患者可能被诊断出患有多种疾病,并且可以随时添加一种疾病。我可能有将近100个。如果高血压的 ID 为 1,关节炎为 2,同时患有这两种疾病的患者将有 diseaseTreated field with "1","2" in the treatment table

预期的解决方案-- 我需要获得第一次或第二次治疗特定疾病的报告,即再次治疗同一疾病(如果我想知道第一次有多少高血压病例,以及如何治疗)许多高血压病例是反复发作的)

示例 - 新病例报告

Disease | New Cases
Hypertension | 4

示例 - 复发病例报告

Disease | New Cases
Hypertension | 1
Arthritis    | 2

我正在使用 Laravel 我尝试了很多解决方案,但这是我发现太接近而无法获得所需的解决方案:我尝试的其他方法是循环遍历我使用连接从数据库中查询的不同数组结果,但我没有发布因为他们没有产生任何重要的东西。

$diseaseID
$countedDiseaseCases = DB::select('select * from treatmentTable where JSON_CONTAINS(diseases, \'[\"'.$diseaseID.'\"]\')')

这会让我得到具有特定疾病的行,并通过在结果上使用 php count(),我得到一个 int 为 3 的结果,这没关系,但我不必像我期望的那样输入它过滤和区分新的和复发病例。

谢谢, 任何建议将不胜感激

【问题讨论】:

我强烈建议使用数据透视表而不是在单个列中存储多个 id。 @RossWilson 不是 laravel 帮你管理的吗? 不,不幸的是它没有。您需要自己创建表。 Laravel 将允许您在模型中设置关系,但它不会自动为您执行此操作。 【参考方案1】:

如果 deseaseTreatated 列是 json,你不能添加一个 isNew 键,当患者第二次就诊时,将该键翻转为 false 或类似的东西吗?

现在,当您想要制作报告时,您可以对所有这些进行计数。

//example deseaseTreated value 

  "deseases": [
    
      "deseaseID":"Value", 
      "isNew":Boolean,
      ...
    , 
    ...
  ]

$records = DB::select('select * from treatment');
$diseases = DB::select('select * from diseases');
foreach ($diseases as $disease) 
    $disease['count_new'] = 0;

foreach ($records as $record) 
    $json = json_decode($record['diseaseTreated']);
    foreach ($json['diseases'] as disease_index) 
    if ($disease_index['isNew']) 
        foreach ($diseases as &$d) 
            if ($d['diseaseID'] == $disease_index['diseaseID']) 
                $d['count_new']++;
            
        
    

【讨论】:

以上是关于从逗号分隔的 JSON mysql 字段查询报告的主要内容,如果未能解决你的问题,请参考以下文章

php 如何从mysql输出数组用逗号分隔?

mysql 查询库中所有的字段,逗号分隔

MYSQL查询某字段中以逗号分隔的字符串的方法

MySQL查询从字段中删除重复值[重复]

在sql server数据库中查询一个用逗号分隔的字段的问题

mysql 查询某字段中以逗号分隔的字符串的包含查询和关联查询实现