我有一个MySQL数据库表,它映射了一个多对多关系。数据库表包含两列,它们是来自其他表的外键。因此,该数据库表仅用于从表A分配外键到表B中的外键。
桌子的结构
第1列:conditionID(int11)(外键)
第2列:packageID(int11)(外键)
CREATE TABLE `many_to_many_table` (
`conditionID` int(11) NOT NULL,
`packageID` int(11) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
ALTER TABLE `many_to_many_table`
ADD KEY `conditionID` (`conditionID`,`packageID`);
我想知道,如果这个表中存在一个组合。例如,用户具有IDs 1、2和3的条件。使用这些ID,具有ID 1的包已经存在。参赛作品有1 | 1、1 | 2和1 | 3。
样本数据
INSERT INTO `many_to_many_table` (`conditionID`, `packageID`) VALUES
(1, 195), (2, 195), (3, 195), (4, 197), (5, 197), (5, 209), (6, 198), (6, 211), (6, 219), (6, 220);
对于这个示例数据,查询应该返回packageID 195。
我尝试了以下方法:
SELECT
packageID,
conditionID,
(
SELECT
COUNT(*)
FROM
many_to_many_table
WHERE
conditionID IN (1,2,3)
) AS rowCount
FROM
many_to_many_table
GROUP BY
packageID
HAVING
conditionID IN (1,2,3)
AND
rowCount = 3
这在第一时间起作用了。但它选择的条目只有conditionID 1或conditionID 2和不同的packageID。此查询不够精确,无法获取重复项。
一个查询就可以了吗?
最佳答案
如果我正确理解你,你需要:
SELECT packageID
FROM many_to_many_table
WHERE conditionId IN (1,2,3)
GROUP BY packageID
HAVING SUM(conditionId = 1) > 0
AND SUM(conditionId = 2) > 0
AND SUM(conditionId = 3) > 0;
DBFiddle