mysql - 列出受相同抗生素影响的细菌对
问题描述
这是我的第一个 sql 查询任务中的最后一个任务,我发现它比其他任务要困难得多。我有三张桌子:
- Bacteria(bid,name) - 包含细菌的 id 和名称
- Antibiotic(aid,name) - 包含抗生素的 id 和名称
- Effect(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)
我知道语法是错误的,甚至可能是我的方法。
我完成这项任务的最佳方式是什么?
谢谢
解决方案
您需要在此处进行关系除法查询。
对于以下数据
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)
推荐阅读
- security - WSO2:trp.vfs 变量最终出现在请求标头中(无论如何)
- spring-boot - Kafka 状态存储在分布式环境中不可用
- amazon-web-services - s3 原始存储桶的子目录中的 Cloudfront 默认根对象
- c++ - 按整数值显示记录
- nginx - 使用 helm chart 部署 nginx 负载均衡服务时,helm values.yaml 应该是什么样的?
- android - Google Cloud IoT Core 端到端原型示例问题(将传感器数据从手机读取到 Cloud IoT Core)
- excel - 过滤和删除在第 1 行(标题)中具有特定值的特定列的行
- php - 在块中渲染奏鸣曲管理员列表
- java - Jaspersonf iReport 子报表填充了 arraylist 作为主报表中的参数,超过 1 页会导致 java.lang.StackOverflowError,
- javascript - 将日期与字符串 javascript 进行比较