【问题标题】:SQL Query for exact match in many to many relation多对多关系中精确匹配的 SQL 查询
【发布时间】:2013-09-27 14:21:20
【问题描述】:

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

  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, '50ml')
  3. (2, 1, '100mg')
  4. (2, 2, '60ml')
  5. (3, 1, '100mg')
  6. (3, 2, '50ml')

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

我想找出给定药物 ID 的等效药物。

注意:一种药物可能有任意数量的仿制药。医学表有大约 102000 条记录,通用表大约 2200 条记录和效力表大约 200000 条记录。所以性能是关键。

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

【问题讨论】:

  • 你是说你不想包括2,即使它具有相同的仿制药,'六氯定'甚至具有相同的效力,因为'苯甲酸甲酯'的仿制药具有不同的效力?
  • @Steve 是的。因为只有当两种药物具有完全相同的仿制药和完全相同的效力时,它们才会等效。

标签: mysql sql many-to-many


【解决方案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演示

【讨论】:

  • 这很有魅力。我尝试的查询耗时超过 10 秒。您的查询只是飞行。非常感谢。
猜你喜欢
  • 1970-01-01
  • 2022-10-07
  • 1970-01-01
  • 2020-04-21
  • 2019-04-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多