我有一个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

10-02 10:46