2013-09-26 245 views
1

精確匹配,我有以下表(只列出所需的屬性)SQL查詢在多對多關係

  1. 醫藥(ID,姓名),
  2. 通用(ID,姓名),
  3. med_gen(med_id引用藥(ID),GEN_ID引用通用(ID),效價)

樣本數據

醫藥

  1. (1, '藏紅花素')
  2. (2, 'Stamlo')
  3. (3, 'NT KUF')

通用

  1. (1, 'Hexachlorodine')
  2. (2,'Methyl Benzoate')

med_gen

  1. (1,1, '100毫克')
  2. (1,2, '50毫升')
  3. (2,1, '100毫克')
  4. (2,2, '60毫升')
  5. (3,1, '100毫克')
  6. (3,2, '50毫升')

我想所有這些等同於一個給定的MED藥品icine。這些藥物具有相同的通用性和相同的效力。在上述示例數據中,所有三者都具有相同的泛型,但只有1和3對相應的泛型具有相同的效力。所以1和3是等同的藥物。

我想找出藥物ID相同的藥物。

注:一種藥可能有任何數量的仿製藥。藥表有102000個記錄,2200年左右的通用表和200000個記錄的有效表。所以表演是一個關鍵點。

注2:MySQL中使用的數據庫。

+0

你是說你不想包括2即使它具有相同的通用符號,'六氯代碘'甚至具有相同的效力,因爲「甲基苯甲酸酯」的通用名稱具有不同的效力? – Steve

+0

@Steve是的。因爲兩種藥物只有在具有完全相同的仿製藥和完全相同的藥效時才相同。 – vagabondtechie

回答

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

+0

這個作品很有魅力。我試過的查詢花了超過10秒鐘。你的查詢只是蒼蠅。萬分感謝。 – vagabondtechie