MySQL查询问题(重复结果)

时间:2011-01-12 12:36:25

标签: php mysql sql duplicates

我在mysql数据库(鸡尾酒配方网站)中找到重复结果时遇到问题。在这里设置:

表1:'鸡尾酒' [cid,c_name](cid =唯一鸡尾酒ID,c_name =鸡尾酒名称)

表2:'成分':
[iid,i_name](iid =唯一成分id,i_name =成分名称)

表3:'cocktail_ingredients'(链接表)
[ciid,cid,iid](ciid =唯一行标识符,cid =鸡尾酒cid,iid =成分iid)

所以一个鸡尾酒可以在'cocktail_ingredients'表中有多行(1到多个)。

设置很好。我现在遇到的问题是找到我的数据库中是否有重复的鸡尾酒。

例如,如果cocktail_ingredients表有这些条目:

cid | IID
1 | 56个
1 | 78个
1 | 101个
。 。 。
9 | 56个
9 | 78个
9 | 101个

鸡尾酒是一样的(无论如何都是为了理论目的)。

如果'cocktail_ingredients'表还有一行......

9 | 103

然后它会不一样,因为9号鸡尾酒会包含额外的成分。

所以mysql必须进行2次检查,首先是成分计数是相同的,其次是相应鸡尾酒(cid)的每种成分id(iid)相同。

我对这一个感到难过,任何帮助都非常感激。我想我可能不得不沿着PHP路线前往更复杂的代码编码,但我也在那里苦苦挣扎,所以认为这将是一个停下来问的好地方。

非常感谢

尼克

2 个答案:

答案 0 :(得分:1)

您可以从远程数学类中回忆一下,集合相等的定义是A abd B都是彼此的子集(非严格),所以只需创建一个视图或过程来检查A中的每个细节是否为同样在B中,然后检查两个鸡尾酒是否是彼此的子集。这远不是一个完整的答案,但它可能足以让你去;)

可能更容易做出否定 - 在A中找到不在B中的成分。不存在,那么A必须是B的严格子集(假设A和B不能都是空的)

或者对A中的每种成分,每种成分离子B以及A和B中的每种成分进行计数,然后如果它们相等则它们是等效的鸡尾酒

CREATE VIEW ingredient_count AS
SELECT cid, count(*) as ingredients
FROM cocktail_ingredients
GROUP BY cid

CREATE VIEW shared_ingredients AS
SELECT c1.cid cid1, c2.cid cid2, count(*) as ingredients
FROM cocktail_ingredients as c1 INNER JOIN cocktail_ingredients as c2 
ON (c1.cid != c2.cid AND c1.iid = c2.iid)
GROUP BY c1.cid,c2.cid

CREATE VIEW duplicates AS
SELECT cid1,cid2
FROM (ingredient_count AS ic1 INNER JOIN shared_ingredients
        ON ic1.cid=cid1) INNER JOIN ingredient_count as ic2
     ON ic2.cid=cid2
WHERE ic1.ingredients=ic2.ingredients
AND   shared_ingredients=ic1.ingredients

注意这在mysql中可能要快得多,其中subselect with where where子句而不是视图,但这更容易理解

答案 1 :(得分:-1)

您可以使用TRIGGER强制执行此类检查。 但是,还有一个概念问题。

说,你有两个鸡尾酒{1 | 56, 78, 101}{9 | 56, 78, 101, 103},并假设你已经实施了支票。

现在,您正在为1:

插入数据
cid |  iid
----------
1   |  56

然后,添加其余两种成分......

cid |  iid
----------
1   |  56
1   |  78
1   | 101

很好,现在你开始添加9:

cid |  iid
----------
1   |  56
1   |  78
1   | 101
9   |  56

你还有三种成分,所以继续添加它们:

cid |  iid
----------
1   |  56
1   |  78
1   | 101
9   |  56
9   |  78

剩下两个(101,103) 可惜!你无法添加101!如果您尝试添加101,那么9将与1相同,您的触发器将阻止您添加。

当鸡尾酒是另一个鸡尾酒的子集时,您必须稍后添加该子集。我希望我能让你理解这一点。

您不应对数据库进行任何限制。我在我的网络应用程序中要做的是:

  1. 在鸡尾酒条目/更新界面中,我会接受用户输入(尚未在数据库中插入/更新)

  2. 当用户点击保存按钮时(我会添加一个保存按钮),检查新的/更新的鸡尾酒是否会成为另一个鸡尾酒的副本(可能我会写一个存储过程,但可以使用选择找到它)仅查询)

  3. 如果新/更新的鸡尾酒与其他鸡尾酒不重复,请插入/更新数据库。如果