2

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

  1. 药物(身份证,姓名),
  2. 通用(ID,名称),
  3. med_gen(med_id 参考药物(id),gen_id 参考通用(id),效力)

样本数据

药物

  1. (1,“藏红花”)
  2. (2,“斯坦洛”)
  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 中使用的数据库。

4

1 回答 1

2

在 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演示

于 2013-09-26T21:13:18.390 回答