列出受同一抗生素影响的细菌对

时间:2018-05-30 11:15:17

标签: mysql sql

这是我的第一个sql查询分配中的最后一个任务,我发现它比其他任务困难得多。 我有三张桌子

  • 细菌(bid,name) - 包含细菌的id和名称
  • 抗生素(援助,名称) - 包含抗生素的名称和名称
  • 效果(援助,投标) - 包含影响细菌的抗生素的ID(使用的细菌ID)

任务要求给予受相同抗生素影响的细菌对(如果抗生素影响细菌A,它也应该影响细菌B - 反之亦然)。

我在想

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 :(得分:1)

这实际上非常简单。这是一个自我加入。

首先,我想告诫你在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

这会返回细菌ID。我将让你努力获得实际的名字。

答案 1 :(得分:1)

您需要在此处进行关系除法查询。

以下数据

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)的影响

Demo