确定是否存在多对多记录组合

| 使用简单的解决方案似乎将是一项常见任务,但是我在StackOverflow和Google上都是空手而归。 场景是这样的:我有两个表A和B,它们共享多对多关系。因此,我有带有外键的表A_B,该表映射了A到B的记录关系。标准的东西。 我想弄清楚的是,如果已经存在匹配的相同关系,则在输入新记录(一个\'A \'记录和一个或多个\'B \'记录)之前如何查询表。目标是不重复数据。 最后,这些表将变得非常大,因此我需要尽可能降低开销。 更新 下面是我正在尝试的示例查询,以确定是否存在映射到B_id值3、4和5的现有A记录。它可以工作,但是如果有两个跨越3、4的不同A_id值,则返回假阳性。和5,例如: A_id = 1,B_id值= 2,3 A_id = 2,B_id值= 4,5,6
SELECT A_id, B_id
FROM A_B
GROUP BY
A_id HAVING
    B_id IN (3,4,5)
    AND
    COUNT(*) = 3
LIMIT 1
更新2 A_B表的主键是包含A_id和B_id的复合键。 A_B表定义一个唯一的组合键,包括A_id和B_id。 单个A由一个或多个B组成。 解决这个问题的一种更通用的方式:给定一组有限的B id值,我需要确定是否存在一个由该精确的B组组成的现有A。如果不是,则使用该组B创建新的A。 干杯     
已邀请:
你真的有外键吗?应该有一种方法可以声明table1.key-> table2.key的这种组合是唯一的。 当生成一对已经存在的条目时,这将导致常规的SQL错误。这就是我喜欢的外来钥匙。这很干净,因为(不允许)条目的智能信息停留在数据库级别。 您有一个包含作业的表A_B,不是吗? A.id 88属于B.id 99 ...等吗? 您打算插入一个A记录和n个B记录? 为什么不-如果新值是A = 99和B:10、11、12、17、18、20
SELECT b_id
FROM A_B
WHERE a_id = 99
AND b_id IN (10, 11, 12, 17, 18, 20);
这将产生一个b_id列表,您不能再次插入...或一个空结果(所有条目都是新的)。     
为什么不只是查询表以查看是否存在现有记录?
$query = \"SELECT * from tableA_B WHERE columnA = A\"
$result = mysql_query($query);
if( mysql_num_rows($result) > 1){
    //do something about having entries
}
很显然,您将不得不用实际值以及A的搜索参数替换表名和列名。     
GROUP_CONCAT进行救援!给定B_id值1、3和5,这是您(I)如何确定该唯一组合是否存在并同时检索对应的A_id的方法:
SELECT A_id FROM A_B
GROUP BY A_id
HAVING GROUP_CONCAT(B_id) = \'1,3,5\';
不需要子查询,可以通过在A_B表上添加复合索引A_id_B_id进行优化。 感谢参加会议的参与者,他们最终引导我朝着正确的方向前进。 干杯     

要回复问题请先登录注册