2

私はそれを私のタイトルに要約しようとしましたが、私が達成しようとしていることを以下でより詳細に説明させてください。

現在、以下に示すように、配列をクエリに渡し、foreachを使用して各配列をデータベースに挿入しています。

if(is_array($myArr)){
 foreach($myArr as $userID=> $email){
  $sql = "INSERT INTO userdata (userID, email) values ('$userID', '$email')";
  mysql_query($sql) or exit(mysql_error());
 }
}

現在、私の配列は次のように見えます

Array
(
[39] => sessa@test.com
[54] => sessa@test.com
[55] => sessa@test.com
[56] => sessa@test.com
[57] => mark@foo.com
[58] => mark@foo.com
[59] => mark@foo.com
[60] => mark@foo.com
[61] => sam@bar.com
[62] => sam@bar.com
[63] => sam@bar.com
[64] => sam@bar.com
)

'$ userID'は[39]で、'email'は..wellemailです。

これが私の質問の出番です。

私が達成したいのは、この「url」列の「url」という名前の新しい列に新しいIDを挿入することです。1ずつインクリメントして、同じ電子メールの行に同じ値を追加できるようにします。

だからこのようなもの。

UserID |    email        | url  
===============================
  39   |  sessa@test.com |  1   
  54   | sessa@test.com  |  1  
  55   | sessa@test.com  |  1  
  56   | sessa@test.com  |  1  
  57   | mark@foo.com    |  2  
  58   | mark@foo.com    |  2  
  59   | mark@foo.com    |  2   
  60   | mark@foo.com    |  2  
  61   | sam@bar.com     |  3  
  62   | sam@bar.com     |  3  
  63   | sam@bar.com     |  3  
  64   | sam@bar.com     |  3  

これが理にかなっていることを願っています。読んでくれてありがとう。いつも助けに感謝します。

4

4 に答える 4

4

ONDUPLICATEKEYを選びます。

メールに一意のインデックスがあることを確認してください。

if(is_array($myArr)){
 foreach($myArr as $userID=> $email){
  $sql = "INSERT INTO userdata (userID, email) values ('$userID', '$email') 
        ON DUPLICATE KEY UPDATE url=url+1";
  mysql_query($sql) or exit(mysql_error());
 }
}

編集:

OK、これが解決策かもしれません:

$data = array();
$ids = 1;

if(is_array($myArr)){
    foreach($myArr as $userID=> $email){

       $domain = substr(strstr($email,"@"),1);

        if (! isset($data[$domain]))
        {
            $data[$domain] = $ids;
            $ids ++;
        }

        $sql = "INSERT INTO userdata (userID, email,url) 
                VALUES ('$userID', '$email','".$data[$domain]."')";
        mysql_query($sql) or exit(mysql_error());
    }
}
于 2013-03-04T21:07:45.077 に答える
1
 if(is_array($myArr)) : 

foreach($myArr as $userID=> $email){

    $emails[] = $email;
}

$emails = array_unique($emails);

foreach($emails as $e){
    $counter = 0;
    foreach($myArr as $userID=> $email){

        if($email == $e){

            $sql = "INSERT INTO userdata (userID, email,url) values ('$userID', '$email','$counter')";
            $counter++;
        }
    }

}

endif;

これを使用して、すべての挿入に対して1つのSQLステートメントを作成できます。

   if(is_array($myArr)) : 

    foreach($myArr as $userID=> $email){

        $emails[] = $email;
    }

    $emails = array_unique($emails);
    $sql = '';
            $counter = 1;
    foreach($emails as $e){

        foreach($myArr as $userID=> $email){

            if($email == $e){

                $sql .= "INSERT INTO userdata (userID, email,url) values ('$userID', '$email','$counter');";

            }
        }
        $counter++;
    }

    endif;

    mysql_query($sql) or exit(mysql_error());

SQL出力

        INSERT INTO userdata (userID, email,url) values ('39', 'sessa@test.com','1');INSERT INTO userdata (userID, email,url) values ('54', 'sessa@test.com','1');INSERT INTO userdata (userID, email,url) values ('55', 'sessa@test.com','1');INSERT INTO userdata (userID, email,url) values ('56', 'sessa@test.com','1');INSERT INTO userdata (userID, email,url) values ('57', 'mark@foo.com','2');INSERT INTO userdata (userID, email,url) values ('58', 'mark@foo.com','2');INSERT INTO userdata (userID, email,url) values ('59', 'mark@foo.com','2');INSERT INTO userdata (userID, email,url) values ('60', 'mark@foo.com','2');INSERT INTO userdata (userID, email,url) values ('61', 'sam@bar.com','3');INSERT INTO userdata (userID, email,url) values ('62', 'sam@bar.com','3');INSERT INTO userdata (userID, email,url) values ('63', 'sam@bar.com','3');INSERT INTO userdata (userID, email,url) values ('64', 'sam@bar.com','3');
于 2013-03-04T21:06:20.470 に答える
1

1つのクエリで整理できます。

if(is_array($myArr)){
 foreach($myArr as $userID=> $email){
  $sql = "INSERT INTO `userdata` (`userID`, `email`, `url`) 
         select '$userID', '$email', count(`email`) +1 from `userdata` where `email` = '$email'";
  mysql_query($sql) or exit(mysql_error());
 }
}
于 2013-03-04T21:16:17.423 に答える
0

十分なメモリがある場合は、もう1つの配列データ構造を作成し、電子メールとIDを保存できます。

たとえば、forループでこのようなことを行うことができます...

$data = array();
$i = 0;

if(is_array($myArr)){
    foreach($myArr as $userID=> $email){
        $url_id = '';

        if (! isset($data[$email]))
        {
            $data[$email] = ++$i;
        }

        $url_id  = $data[$email];

        $sql = "INSERT INTO userdata (userID, email,url) values ('$userID', '$email','$url_id')";
        mysql_query($sql) or exit(mysql_error());
    }
}

私はそれが最も効率的な解決策だとは思いません..しかしそれはうまくいくはずです..

于 2013-03-04T21:10:09.693 に答える