2017-08-15 71 views
2

我有一个MySQL数据库表映射多对多的关系。数据库表包含两列,这两列是来自其他表的外键。所以这个数据库表只能存在于从表B.从分配表A中的外键外键查找重复在很多关系

柱1的结构:conditionID(INT11)(外键) 列2:包标识(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); 

有了这个样本数据的查询应该返回包标识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 

这在运行良好第一时刻。但它选择仅具有条件ID 1或条件ID 2和不同packageID的条目。这个查询不足以获得重复。

这是可能的一个查询?

+0

所以,你有conditionIDs的一个特定的顺序,你想知道是否存在所有这些conditionIDs配对包标识?这种packageID与一些​​不同的conditionID配对可能吗? –

+0

是的。我想知道是否有包含所有这些条件ID的packageID。这是不可能的,那就是具有不同conditionID的packageID。 – Marcel

+0

请参阅:[为什么我应该为我认为是非常简单的SQL查询提供一个MCVE?](https://meta.stackoverflow.com/questions/333952/why-should-i-provide-an-mcve - 对于什么似乎对我来说是一个非常简单的SQL查询) – Strawberry

回答

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

+1

就像一个迷人的作品。非常感谢你。 – Marcel