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

2wnc66cl  于 2021-06-23  发布在  Mysql
关注(0)|答案(2)|浏览(188)

这是我第一个sql查询分配中的最后一个任务,我发现它比其他任务要困难得多。我有三张table:
细菌(bid,name)-包含细菌的id和名称
抗生素(aid,name)-包含抗生素的id和名称
效果(aid,bid)-包含影响细菌的抗生素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)

我知道语法是错误的,甚至可能是我的方法。
对我来说,完成这项任务的最佳方法是什么?
谢谢您

bogh5gae

bogh5gae1#

这里需要一个关系除法查询。
对于以下数据

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

显示具有ids 1和ids 2的细菌都受到同一组抗生素的影响(20和21)
演示

yvt65v4c

yvt65v4c2#

这其实很简单。它是一个自连接。
不过,首先,我要告诫你在这个词中使用逗号 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。我会让你努力弄清楚真实的名字。

相关问题