如何根据使用mysql和php输入的值插入重复值

如何根据使用mysql和php输入的值插入重复值,php,mysql,Php,Mysql,我试着在我的标题上总结一下,但让我在下面更详细地向你们解释我正在努力实现的目标 目前,我向查询传递了一个数组,并使用foreach将每个数组插入到我的数据库中,如下所示 if(is_array($myArr)){ foreach($myArr as $userID=> $email){ $sql = "INSERT INTO userdata (userID, email) values ('$userID', '$email')"; mysql_query($sql) or e

我试着在我的标题上总结一下,但让我在下面更详细地向你们解释我正在努力实现的目标

目前,我向查询传递了一个数组,并使用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”是..well电子邮件

这就是我的问题所在

我想要实现的是在一个新的列中插入一个新的id,我在这个“url”列中调用了“url”,我希望能够以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  
我希望这是有意义的。谢谢你的阅读。永远感谢你的帮助

 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;
您可以使用此命令为所有insert创建一条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');

我会用重复的钥匙

确保您在电子邮件上有唯一的索引

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());
 }
}
编辑:

好的,这可能是解决方案:

$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());
    }
}

如果您有足够的内存,您可以再创建一个阵列数据结构并存储电子邮件和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());
    }
}

我认为这不是最有效的解决办法。。但是它应该可以工作。

您可以通过一个查询来组织它

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());
 }
}

这听起来像是需要一个带有
id,email
(其中id包含autoincrement列)的表,以及一个带有
userId,url
?@Wrikken嗨,Wrikken我已经简化了这个问题的表。感谢您的输入:)这并不意味着它仍然闻不到某种正常化可能是健康的,但嘿,您比我更能判断是否需要它;)这太神奇了。。但他希望在收到一封新邮件后获得+的回复。这不是每个电子邮件的增量url吗?所以发邮件1-1234然后发邮件21234@John您好,John,您的第二个解决方案似乎是使用同一封电子邮件增加url id。@BaconJuice我更新了我的答案。我不明白这个问题。您想要电子邮件地址中每个域名的ID吗?我的代码现在应该可以工作了。@John不,它不是特定于域的。我已经在上面的问题中做了概述。实际上,使用
mysql\u query()
Yes,一次只能运行一个查询。这是我的第二个解决方案。。最好的。。为什么你可以创建一个查询,却要多次点击数据库;从手动
mysql\u query()向服务器上与指定链接\u标识符关联的当前活动数据库发送唯一查询(不支持多个查询)
well
mysql\u query
是一种访问数据库的旧方法,为什么他不使用PDO?这就是问题所在