这是我的第一个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)
我知道语法错误,甚至可能是我的方法。
我接触此任务的最佳方式是什么?
谢谢
答案 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)的影响