2013-09-26 4 views
1

я следующие таблицы (только перечислены необходимые атрибуты)SQL запросов для точного соответствия во многих ко многим отношению

  1. медицины (идентификатор, имя),
  2. родовое (идентификатор, имя),
  3. med_gen (med_id ссылки медицина (ID), GEN_ID ссылки родовое (ID), потенция)

Примеры данных

медицина

  1. (1, 'Кроцин')
  2. (2, 'Stamlo')
  3. (3, 'NT Куф')

родовое

  1. (1, «Гексахлордин»)
  2. (2, 'Метилбензоат)

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мл')

Я хочу, чтобы все лекарства, которые эквивалентны данной мед icine. Эти лекарства эквивалентны друг другу, которые имеют такую ​​же общую и такую ​​же эффективность. В приведенных выше данных выборки все три имеют одинаковые дженерики, но только 1 и три также имеют одинаковые потенции для соответствующих дженериков. Итак, 1 и 3 являются эквивалентными лекарствами.

Я хочу найти эквивалентные лекарства, учитывая лекарственный идентификатор.

ПРИМЕЧАНИЕ. В одном лекарстве может быть любое количество дженериков. Стол медицина имеет около 102 000 записей, общий стол около 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

Смежные вопросы