1

告白:mysql newbには、やや大きなテーブルで重複する行を見つけるための簡単な例が必要です。同様のタイトルを持つ他の多くのスレッドを検索して読んだことがありますが、例が非常に複雑であるため、基本的な状況に適用できません。

MySQLテーブルには5つのフィールドしかありませんが、数百の行があります。重複する行を見つけたいのですが、確かに1つあることはわかっていますが、他の行があるかどうか疑問に思います。

行の例:(rel_idは自動インクリメント、主キーフィールド)

'rel_id' => 1
'host' => 17
'host_type' => 'client'
'rep' => 7
'rep_type => 'cli_mgr'

私のアプローチは次のとおり
です。1。テーブル全体をmysqlクエリに読み込みます
。2。行ごとに4つのデータフィールドを前の(「完了」)行のデータフィールドと比較します。3
。「新しい」行を比較した後、次の配列に追加します。 「完了」行

これが私が試したことです。もっと簡単な解決策があるはずです。「done」行の配列に「new」行を追加しようとすると、行き詰まっていることがわかります。

$rRels = mysql_query("SELECT * FROM `rels`");
$a = array();
$e = array();
$c1 = 0;
$c2 = 0;
While ($r = mysql_fetch_assoc($rRels)) {
    $i = $r['rel_id'];
    $h = $r['host'];
    $ht = $r['host_type'];
    $r = $r['rep'];
    $rt = $r['rep_type'];

    foreach($a as $row) {
        $xh = $row['host'];
        $xht = $row['host_type'];
        $xr = $row['rel'];
        $xrt = $row['rel_type'];

        if (($h==$xh) && ($ht==$xht) && ($r==$xr) && ($rt==$xrt)) {
            echo 'Found one<br>';
            $e[] = $r;
        }
        $c2++;
    }
    $a = array_merge(array('rel_id'=>$i, 'host'=>$h, 'host_type'=>$ht, 'rep'=>$r, 'rep_type'=>$rt), $a);
    $c1++;
}

echo '<h3>Duplicate Rows:</h3>';
foreach ($e as $row) {
    print_r($row);
    echo '<br>';
}
echo '<br><br>';
echo 'Counter 1: ' . $c1 . '<br>';
echo 'Counter 2: ' . $c2 . '<br>';
4

4 に答える 4

4

これでうまくいくはずです:

SELECT COUNT(*) as cnt, GROUP_CONCAT(rel_id) AS ids
FROM rels
GROUP BY host, host_type, rep, rep_type
HAVING cnt > 1

「重複」レコードはcnt>1になり、group_concatは重複レコードのIDを提供します。

于 2012-11-07T18:54:56.037 に答える
1

純粋なno-phpソリューション:データなしで古いテーブル(oldTableという名前)のコピーを作成する

create table newTable like oldTable;

重複を防ぐために構造を変更し、5列すべてに一意のキーを追加します。

alter table newTable add unique index(rel_id,host,host_type,rep,rep_type );

次に、SQLクエリでoldTableから行をコピーします

insert IGNORE into newTable select * from oldTable

newTableには、一意のデータのみがあります。

別のオプションはgroupbyです。重複する行の数を取得する場合は、

select  concat_ws('_',rel_id,host,host_type,rep,rep_type) as str, count(*) 
from oldTable 
group by str
于 2012-11-07T19:01:00.627 に答える
0

このクエリを使用して、重複するすべての行を見つけることができます。うまくいけば、PHPコードに簡単に統合できるはずです。

// This will give you all the duplicates
// Self join where all the columns have the same values but different primary keys

SELECT * 
FROM   rels t1, rels t2
WHERE  t1.rel_id != t2.rel_id
AND    t1.host = t2.host
AND    t1.host_type = t2.host_type
AND    t1.rep = t2.rep
AND    t1.rep_type = t2.rep_type
于 2012-11-07T18:53:02.973 に答える
0

重複の検索は、PHPよりもSQLの方が簡単に実行できます。

SELECT GROUP_CONCAT(rel_id)
FROM rels
GROUP BY host, host_type, rep, rep_type HAVING COUNT(rel_id)>1;

これにより、同一のレコードを指すrel_idのグループが表示されます。このHAVING COUNT(rel_id)>1句を使用すると、重複していないレコードをスキップできます。

于 2012-11-07T18:58:34.423 に答える