SQL查询在多对多关系中完全匹配

时间:2013-09-26 18:42:45

标签: mysql sql many-to-many

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

  1. 药(id,name),
  2. generic(id,name),
  3. med_gen(med_id引用药(id),gen_id引用通用(id),效力)
  4. 样本数据

    1. (1,' Crocin')
    2. (2,' Stamlo')
    3. (3,' NT Kuf')
    4. 通用

      1. (1,' Hexachlorodine')
      2. (2,'苯甲酸甲酯')
      3. 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')
        7. 我想要所有相当于给定药物的药物。这些药物彼此相同,具有相同的通用性和相同的效力。在上面的样本数据中,所有三个都具有相同的泛型,但只有1和3对相应的泛型具有相同的效力。所以1和3是同等药物。

          我想找出同样的药物给药。

          注意:一种药可能含有任何数量的仿制药。 Medicine表有大约102000条记录,通用表大约2200条,效力表大约有200000条记录。所以表现是关键点。

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

1 个答案:

答案 0 :(得分: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 演示