5

2 つの物質を混合できるかどうかを説明する 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

小さなテーブルでは最後のステップは非常に簡単でしたが、大きなテーブルでは手動で行うと非常に時間がかかります。MEANING が重複しているが内容が同一ではない行の削除を自動化するにはどうすればよいでしょうか?

ありがとう、私はまだデータベースを学んでいるので、私の質問が理にかなっていることを願っています

4

3 に答える 3

4

すべての関係が 2 倍になった状態で開始していると想定しても安全な場合、たとえば

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: 列の並べ替え、個別の選択

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 に答える