小编典典

SQL查询在多对多关系中的精确匹配

sql

我有以下表格(仅列出必需的属性)

  1. 药品(身份证,姓名),
  2. 通用(ID,名称),
  3. med_gen(med_id引用医学(id),gen_id引用一般(id),效力)

样本数据

药物

  1. (1,“ Crocin”)
  2. (2,“ Stamlo”)
  3. (3,’NT Kuf’)

通用的

  1. (1,“六氯丁啶”)
  2. (2,’苯甲酸甲酯’)

med_gen

  1. (1,1,‘100mg’)
  2. (1、2,“ 50毫升”)
  3. (2,1,‘100mg’)
  4. (2,2,‘60ml’)
  5. (3,1,‘100mg’)
  6. (3,2,‘50毫升’)

我想要所有等同于给定药物的药物。这些药物具有相同的通用性和相同的效力,彼此等效。在上面的示例数据中,所有三个具有相同的泛型,但是只有1和三个对相应的泛型也具有相同的效力。所以1和3是等效的药物。

我想找出具有药物编号的同等药物。

注意:一种药物可能具有多种仿制药。Medicine表大约有102000条记录,generic表大约有2200条记录,potency表大约有200000条记录。因此,性能是关键。

注意2:MySQL中使用的数据库。


阅读 397

收藏
2021-04-28

共1个答案

小编典典

在MySQL中做到这一点的一种方法是利用GROUP_CONCAT()函数

SELECT g.med_id
  FROM 
(
  SELECT med_id, GROUP_CONCAT(gen_id ORDER BY gen_id) gen_id, GROUP_CONCAT(potency ORDER BY potency) potency
    FROM med_gen
   WHERE med_id = 1 -- here 1 is med_id for which you're trying to find analogs
) o JOIN 
(
  SELECT med_id, GROUP_CONCAT(gen_id ORDER BY gen_id) gen_id, GROUP_CONCAT(potency ORDER BY potency) potency
    FROM med_gen
   WHERE med_id <> 1 -- here 1 is med_id for which you're trying to find analogs
   GROUP BY med_id 
) g
 ON o.gen_id = g.gen_id
AND o.potency = g.potency

输出:

| MED_ID |
| -------- |
| 3 |

这是 SQLFiddle 演示

2021-04-28