MySQL group_concat 与 'in' 语句

标签 mysql group-concat subquery

我有两个定义的表:

表 1:患者

| patient_id     | patient_name     |  medications |
------------------------------------------------------
| 1              | Jon Doe          |           1  |
| 2              | Jane Doe         |         2,3  |

表 2:药物治疗

|  medication_id | medication_name  |
--------------------------------------
| 1              |           Med 1  |
| 2              |           Med 2  |
| 3              |           Med 3  |

我使用以下 sql 创建了架构和数据:

create table patient (patient_id INT, patient_name TEXT, medications TEXT);
create table medication (medication_id INT, medication_name TEXT);
INSERT INTO patient VALUES (1, 'Jon Doe', '1');
INSERT INTO patient VALUES (2, 'Jane Doe', '2,3');
INSERT INTO medication VALUES (1, 'Med 1');
INSERT INTO medication VALUES (2, 'Med 2'); 
INSERT INTO medication VALUES (3, 'Med 3');

我正在尝试编写一个查询,该查询将列出患者,其中一列是逗号分隔的药物列表。我尝试过以下查询:

SELECT
  patient_id,
  patient_name,
  medications,
  (SELECT group_concat(medication_name) FROM medication T2 WHERE T2.medication_id in (T1.medications)) as med_names
FROM
  patient T1

问题是,对于第二位患者(Jane Doe),我只得到了第一种药物。结果:

|  patient_id      | patient_name     | medications      | med_names   |
------------------------------------------------------------------------
|  1               | Jon Doe          | 1                | Med 1       |
|  2               | Jane Doe         | 2,3              | Med 2       |

期望的结果是:

|  patient_id      | patient_name     | medications      | med_names     |
--------------------------------------------------------------------------
|  1               | Jon Doe          | 1                | Med 1         |
|  2               | Jane Doe         | 2,3              | Med 2, Med 3  |

这可能吗?任何帮助,将不胜感激。谢谢。

最佳答案

您已将多个值作为字符串放入您的药物字段中。当该字符串值 (2,3) 与实际 med 表中的整数 ID 进行比较时,该字符串将转换为 int。这意味着

JOIN ... ON '2,3' = x

将被解析/执行为

JOIN ... ON 2 = x

这是一个糟糕的表格设计。切勿将多个值放入单个字段中。您应该有一个规范化的设计,这意味着添加一个 patents_meds 表,其中包含 patentID, medID 记录。

阅读一些内容:http://en.wikipedia.org/wiki/Database_normalization

关于MySQL group_concat 与 'in' 语句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27947787/

相关文章:

SQL 选择查询合并行

mysql - 嵌套 CONCAT 中的 LEFT JOIN 和 IS NULL 仅返回 NULL

mysql - 如何用MySQL中以前的非零值替换零值?

mysql - SQL : "NOT IN" subquery optimization or alternatives

php - 在oracledb中设置默认数据库

mysql - 查找一个字段中具有重复项的行之间的差异

MySQL 将一行分解为多行

php - 使用 PHP 通过 id 从数据库中删除特定条目

mysql group_concat 为空字段添加分隔符

sql - 如何选择属于一个组而不是另一个组的项目