这似乎是一个简单解决方案的常见任务,但我在StackOverflow和Google上都是空手而归。
情景是这样的:我有两张桌子A& B分享多对多关系。因此,我有一个带有外键的表A_B,它映射了A到B的记录关系。标准的东西。
我想弄清楚的是,如果已经存在匹配的相同关系,那么在我输入新记录(一个带有一个或多个'B'记录的'A'记录)之前如何查询表。目标是不重复数据。
最后,这些表会变得非常大,所以我需要尽可能地保持开销。
更新
下面是我正在尝试的示例查询,以确定是否存在映射到B_id值3,4和5的现有A记录。它可以工作,但如果有两个不同的A_id值跨越3,则返回误报,4和5,例如:
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.
干杯
答案 0 :(得分:1)
为什么不查询表格以查看是否有现有记录?
$query = "SELECT * from tableA_B WHERE columnA = A"
$result = mysql_query($query);
if( mysql_num_rows($result) > 1){
//do something about having entries
}
您显然必须使用实际值以及A的搜索参数替换表名和列名。
答案 1 :(得分:1)
你真的有外键吗?应该有一种方法来声明table1.key - > table2.key unique的这种组合。 在生成已存在的条目对时,这将导致常规SQL错误。这是我喜欢的foraign键。它非常干净,因为(不)的智能允许条目保持在数据库级别。
你有一张包含作业的表A_B,不是吗? A.id 88属于B.id 99 ...等?
你计划插入一个A-Record和n个B-Records? 为什么不 - 如果新值是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_ids列表,您不能再次插入...或空结果(所有条目都是新的)。
答案 2 :(得分:0)
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来优化。
感谢参与者,他们指引并最终引导我朝着正确的方向前进。
干杯