Перечислите пары бактерий, пораженных теми же антибиотиками - PullRequest
0 голосов
/ 30 мая 2018

Это последняя задача в моем первом назначении SQL-запроса, и я нахожу ее значительно более сложной, чем другие задачи. У меня есть три таблицы :

  • Бактерии (заявка, имя) - содержит идентификатор и имена бактерий
  • Антибиотик (помощь, имя) - содержат идентификатор и имяантибиотиков
  • Эффект (помощь, заявка) - содержит идентификатор антибиотика, который воздействует на бактерии (используется идентификатор бактерии)

Задача просит датьпары бактерий, на которых воздействуют одни и те же антибиотики (если антибиотик воздействует на бактерии А, он также должен воздействовать на бактерии В - то же самое можно сказать и об обратном).

Это то, что Я думаю :

SELECT b1.*,b2.*
FROM Bacteria b1, Bacteria b2
WHERE b1.bid, b2.bid IN (SELECT e1.bid, e2.bid
                         FROM Effect e1, Effect e2
                         WHERE e1.aid = e2.aid)

Я знаю, что синтаксис неправильный и, возможно, даже мой подход.

Как мне лучше всего подойти к этой задаче?

Спасибо

Ответы [ 2 ]

0 голосов
/ 30 мая 2018

Вам нужен запрос реляционного деления здесь.

Для следующих данных

CREATE TABLE Effect
(
aid INT,
bid INT
);

INSERT INTO Effect
VALUES (20, 1),
       (21, 1),
       (20, 2),
       (21, 2),
       (21, 3);

Один из способов получения необходимой информации будет

SELECT eaids,
         GROUP_CONCAT(DISTINCT bid
                      ORDER BY bid SEPARATOR ',') as bids
FROM 
(
SELECT bid,
         GROUP_CONCAT(DISTINCT aid
                      ORDER BY aid SEPARATOR ',') as eaids
       FROM Effect
       GROUP BY bid
) T
GROUP BY eaids
HAVING COUNT(*) > 1;  

, который возвращает

    eaids   bids
    20,21   1,2

Показывает, что на бактерии с идентификаторами 1 и 2 влияет один и тот же набор антибиотиков (20 и 21)

Демонстрация

0 голосов
/ 30 мая 2018

Это на самом деле довольно просто.Это самообъединение.

Во-первых, я хочу предостеречь вас от использования запятых в предложении FROM.Если вы изучаете SQL, вы должны изучить его правильно и научиться использовать правильный, явный, стандартный синтаксис JOIN.

Итак, идея такова:

SELECT e1.bid, e2.bid
FROM Effect e1 JOIN
     Effect e2
     ON e1.aid = e2.eid AND
        e1.bid < e2.bid;  -- no need to include the same pair twice

Это возвращаетидентификаторы бактерийЯ позволю тебе работать над получением настоящих имен.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...