【问题标题】:Find Duplicate in many to many relation在多对多关系中查找重复项
【发布时间】:2017-08-15 18:15:48
【问题描述】:

我有一个映射多对多关系的 MySQL 数据库表。数据库表包含两列,它们是来自其他表的外键。所以这个数据库表只存在于将表A的外键分配给表B的外键。

表格的结构

第 1 列:条件 ID (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 的条目。此查询不够精确,无法获取重复项。

这可以通过一个查询来实现吗?

【问题讨论】:

  • 所以你有一定的条件ID序列,你想知道是否有一个包ID与所有这些条件ID配对?这样的 packageID 是否可能与一些不同的 conditionID 配对?
  • 是的。我想知道是否有包含所有这些条件 ID 的 packageID。不可能有相同的 packageID 和不同的 conditionID。
  • 感谢您的建议,@Strawberry。我添加了 CREATE 语句和示例数据。
  • 酷。剩下的呢?

标签: php mysql sql


【解决方案1】:

如果我理解正确,你想要:

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

【讨论】:

  • 像魅力一样工作。非常感谢。
猜你喜欢
  • 2021-03-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-28
  • 1970-01-01
  • 2018-01-30
  • 2020-11-01
  • 1970-01-01
相关资源
最近更新 更多