在多对多关系

时间:2017-08-15 09:23:54

标签: php mysql sql

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

我想知道,如果此表中的组合存在。例如,用户具有ID为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的条目。此查询不够精确,无法获得重复项。

一个查询可以实现吗?

1 个答案:

答案 0 :(得分:3)

如果我理解你想要的话:

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