如何通过结果集选择ID或获得更好的数据模型?

时间:2016-01-27 01:16:04

标签: mysql sql database select

我在选择方面遇到了一些麻烦,我想我可以寻求帮助来解决选择或找到更好的方法来模拟我的数据。我的表格结构如下:

Table A( a_id, a2, a3, a4)  pk: a_id
Table B( b_id, a_id, b3)    pk: b_id, a_id

表B可以为每个b_id提供任意数量的条目,但每个b_id,a_id只能有一个条目。我希望能够为每个b_id引用该集合以检查它们是否存在,以便该集合不会重复。例如,假设我在表C中有一个元组

Table C( c_id, b_id )      pk:c_id

引用b_id为1.如果要将另一个元组插入到C中导致将b_id为1的同一组插入到表B中,我希望新元组具有b_id也是1,而不是插入表B并使用该b_id。

编辑:

this sqlfiddle。假设我想插入一个由以下插入表示的新对象:

INSERT INTO B VALUES (3, 1, 2);
INSERT INTO B VALUES (3, 2, 11;
INSERT INTO B VALUES (3, 3, 5);
INSERT INTO C VALUES (2,3);

如何查询数据库(或重组)以便我能够意识到表b中由b_id为1或3表示的集合是否相同?然后我想改变我的逻辑,以便插入的对象由单个语句表示:

INSERT INTO C VALUES (2,1);

一个真实世界的例子:

想象一下游戏中的玩家。游戏中的每个玩家都是表C中的元组。每个玩家都可以穿任何数量的衣服 - 表B.一件衣服由它所覆盖的身体部分(表A)及其颜色(b3)定义 我想找到穿着特定服装的球员。让我们说玩家再次穿同一套 - 我不应该在表B中添加更多数据,我应该可以说他在上一场比赛中穿了它,所以我们只是参考那套服装

2 个答案:

答案 0 :(得分:1)

您需要编程语言,例如PHP来循环所有条件:

SELECT B.b_id, BB.num, count(*)
FROM B, (
    SELECT b_id, count(*) num
    FROM B
    WHERE (a_id=1 and b3=1)
    OR    (a_id=2 and b3=11)
    OR    (a_id=3 and b3=5)
    OR    (a_id=4 and b3=6)
    -- you need programming language eg php to loop all your set data here
    GROUP BY 1
) as BB
WHERE B.b_id = BB.b_id 
GROUP BY 1,2
HAVING count(*) = 4 and count(*) = BB.num
-- count(*) should be manually input to match above loop of OR

子查询获取b_id和count,如果它们完全相同,则返回与B匹配以匹配。

这意味着,您需要提供完全相同的值集[a_id,b3]才能获得正确的b_id值,而不是子集,而不是支持,完全匹配。

在您的示例数据中,如果要返回bid = 1,则需要提供3组[aid,b3];如果你想返回bid = 2,你需要提供4套[aid,b3]

答案 1 :(得分:0)

如果b_id,a_id不构成表B的唯一标识,那么你实际上没有pk。 无论如何,将UNIQUE(a_id,b3)添加到表B定义将阻止重复的条目值:

INSERT INTO B VALUES (3, 1, 2);
INSERT INTO B VALUES (3, 2, 8);
INSERT INTO B VALUES (3, 3, 10);

外键约束会阻止:

INSERT INTO C VALUES (2,3);

但我不认为这种方法足以满足你的目的。例如,如果B的现有记录包括另一条记录,例如1,5,20,那么上面B中的插入是否正常?