Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/247.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 确定是否存在多对多记录组合_Php_Mysql_Many To Many_Innodb - Fatal编程技术网

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

Php 确定是否存在多对多记录组合,php,mysql,many-to-many,innodb,Php,Mysql,Many To Many,Innodb,这似乎是一个普通的任务,有一个简单的解决方案,但我在StackOverflow和Google上都空手而归 场景是这样的:我有两个共享多对多关系的表A和表B。因此,我有一个带有外键的表A_B,它映射了A-to-B记录关系。标准的东西 我试图弄清楚的是,如果已经存在匹配的、相同的关系,那么在输入新记录(一个“a”记录和一个或多个“B”记录)之前,如何查询表。目标是不复制数据 最后,这些表将变得相当大,因此我需要尽可能降低开销 更新 下面是我尝试的一个查询示例,以确定是否存在映射到B_id值3、4和5

这似乎是一个普通的任务,有一个简单的解决方案,但我在StackOverflow和Google上都空手而归

场景是这样的:我有两个共享多对多关系的表A和表B。因此,我有一个带有外键的表A_B,它映射了A-to-B记录关系。标准的东西

我试图弄清楚的是,如果已经存在匹配的、相同的关系,那么在输入新记录(一个“a”记录和一个或多个“B”记录)之前,如何查询表。目标是不复制数据

最后,这些表将变得相当大,因此我需要尽可能降低开销

更新

下面是我尝试的一个查询示例,以确定是否存在映射到B_id值3、4和5的现有A记录。它可以工作,但是如果有两个不同的A_id值跨越3、4和5,则返回误报,例如:

  • A_id=1,B_id值=2,3
  • A_id=2,B_id值=4,5,6
更新2

A_B表的主键是包含A_id和B_id的复合键

A_B表定义了一个唯一的复合键,包括A_id和B_id

单个A由一个或多个b组成

用一种更一般的方式来表达这个问题:给定一组有限的B id值,我需要能够确定是否存在一个由这组确切的B组成的A。如果不是,则使用该组B创建新a


干杯

为什么不直接查询表以查看是否存在记录

$query = "SELECT * from tableA_B WHERE columnA = A"
$result = mysql_query($query);
if( mysql_num_rows($result) > 1){
    //do something about having entries
}
显然,您必须用实际值以及A的搜索参数替换表名和列名。

您真的有外键吗?应该有一种方法来声明table1.key-->table2.key的这种组合是唯一的。 当生成一对已经存在的条目时,这将导致一个常规的SQL错误。这就是我喜欢的标志键。它非常干净,因为关于(不)允许条目的智能保持在数据库级别

你有一张包含作业的表格,是吗? 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列表。。。或者是一个空结果(所有条目都是新的)。

组\u继续救援!给定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进行优化

多亏了参与者的参与,他们最终引导我走上了正确的方向


干杯

这就是我要问的。我将把我的问题从“如何确定”更新为“如何查询表格”,我想这还不清楚。谢谢,但是我说的是表a中的一条记录和表B中的多条记录之间的唯一关系。您的代码没有解决这个问题。@Madbreaks-如果某个值a有多条关联的B记录,那么查询将返回所有行,每一行都有不同的B值,但a值相同。如果在查询时只有一对一的关系,那么只返回一行。@DShook-我认为您的方法太白纸黑字了:“我可以插入所有值吗?或者不插入一个值”。事实上,可能会出现类似“插入3,省略其中2个!”@DShook-下面是两个唯一映射的示例:A=1,B=1,2(和)A=1,B=1,2,3。这些是不同的映射,但您的查询对它们一视同仁。谢谢。是的,我确实有外键。是的,一个A记录到n个B记录。查询的问题是,如果有a=99记录和B记录10、11、12、17、18、20和21,查询将返回假阳性。B id值必须是唯一的。我补充了更多的问题,也许这会有助于澄清。@Heiko,还有一件事,你说“应该有一种方法来声明table1.key-->table2.key的这个组合是唯一的”。这将打破表A和B之间共享的多对多关系。外键的唯一性并不意味着A和B中的条目是唯一的,而是A->B的唯一组合。如果您打算添加10,11,12,17,18,20,我不理解现有21的问题。如果A=99-->B=10,11,12,17,18,20,21存在,则结果将是[10,11,12,17,18,20]不应插入的值。“也许还有什么我误解了?”海科-伊什,没错。A_B表的两列构成其主键。很抱歉问题是我们不知道“99”。我们只知道“这是一组新的B值。是否存在一个由这些值组成且仅由这些B值组成的现有a?”我将更新我的原始问题。好的,现在我理解了问题中的SQL语句。但它提供了与3、4或5组合的A值,因为count(*)引用外部查询。子选择应该没有问题。想一些没有的东西,再选一个就糟了!你是说,即使A_B关系是多对多关系,也只允许一个A记录与B记录的特定子集相关吗?对不起,我刚才忽略了你的问题。这是正确的。业务逻辑规定A由1个或多个B组成。
SELECT A_id FROM A_B
GROUP BY A_id
HAVING GROUP_CONCAT(B_id) = '1,3,5';