首页 > 解决方案 > 列出受相同抗生素影响的细菌对

问题描述

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

该任务要求给出受相同抗生素影响的细菌对(如果抗生素影响细菌 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)

我知道语法是错误的,甚至可能是我的方法。

我完成这项任务的最佳方式是什么?

谢谢

标签: mysqlsql

解决方案


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

对于以下数据

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

显示 id 为 1 和 2 的细菌都受到同一组抗生素的影响(20 和 21)

演示


推荐阅读