5

假设你有一个 mySQL 表来描述你是否可以混合两种物质

Product   A    B    C
---------------------
A         y    n    y
B         n    y    y
C         y    y    y

第一步是将其转换为

P1   P2   ?
-----------
A    A    y
A    B    n
A    C    y
B    A    y
B    B    y
B    C    n
C    A    y
C    B    n
C    C    y

但是你有重复的信息。(例如,如果 A 可以与 B 混合,则 B 可以与 A 混合),因此,您可以删除几行以获得

P1   P2   ?
-----------
A    A    y
A    B    n
A    C    y
B    B    y
B    C    n
C    C    y

虽然最后一步在一张小桌子上很容易,但在一张更大的桌子上手动完成却要花很长时间。如何自动删除具有重复含义但内容不同的行?

谢谢,我希望我的问题有意义,因为我仍在学习数据库

4

3 回答 3

4

如果可以安全地假设您从所有关系加倍开始,例如

如果A B在表中,则B A保证在表中。

然后你所要做的就是删除所有 P2 < P1; 的行。

DELETE FROM `table_name` WHERE `P2` < `P1`;

如果不是这种情况,您可以通过遍历表并插入所有重复行(如果它们不存在)来实现这种情况,然后运行它。

于 2010-07-26T18:37:32.923 回答
2

我认为在您的情况下没有必要,但作为一项智力练习,您可以建立在 Jamie Wong 的解决方案的基础上,并防止使用 EXISTS 子句删除不重复的列。像这样的东西:

DELETE FROM `table_name` AS t1
  WHERE `P2` < `P1`
    AND EXISTS (SELECT NULL FROM `table_name` AS t2
      WHERE t1.`P1` = t2.`P2` AND t1.`P2` = t2.`P1`);

它几乎只是确保在删除任何内容之前存在重复项。

(我的 MySQL 语法可能有点不对劲;已经有一段时间了。)

于 2010-07-26T18:58:09.920 回答
1

第 1 步(正如您已经完成的那样):转换为 Table2

P1   P2   ?
-----------
A    A    y
A    B    n
A    C    y
B    A    y
B    B    y
B    C    n
C    A    y
C    B    n
C    C    y

第 2 步:重新排序列,选择 Distinct

SELECT DISTINCT
   IF P1<P2 THEN P1 ELSE P2 END as P1, -- this puts the smallest value in P1
   IF P1>P2 THEN P1 ELSE P2 END as P2 -- this puts the largest value in P2
FROM Table2
WHERE NOT P1=P2  --(Assuming records like A, A, y are not interesting)

我不是一个 mySQL 人,所以你可能需要检查 if/then 语法,但这在概念上似乎还可以。

于 2010-07-26T18:57:57.630 回答