这是我第一次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)我知道语法是错误的,甚至可能是我的方法。
,什么是我处理这个任务的最好方法?
谢谢
发布于 2018-05-30 11:18:03
这其实很简单。这是一种自我连接。
不过,首先,我要警告您在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这会返回细菌的识别信息。我让你去查真名。
发布于 2018-05-30 11:50:15
这里需要一个关系除法查询。
对于下列数据
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和2的细菌都受到同一组抗生素(20和21)的影响。
演示
https://stackoverflow.com/questions/50603262
复制相似问题