【问题标题】:PHP/MySQL Update and Insert based on two tables基于两个表的 PHP/MySQL 更新和插入
【发布时间】:2012-01-07 00:32:23
【问题描述】:

这几天我一直在研究这个问题,并且不断遇到绊脚石。我正在尝试从 table2 中选择一个唯一的 id 并将其与 table1 中的 id 匹配。如果 id 匹配,则更新 table1 中的行并从 table2 中删除记录。如果没有匹配则将记录插入到table1中。

我已经到了可以更新记录并插入新记录的地步,但我似乎无法在插入之前删除匹配的记录,因此会创建重复记录。我在更新后尝试了删除连接查询,但因为新的 logon_id 前面有一个字符,它不再匹配 table2。

我之前为更新进行了更新连接,但我有太多查询正在进行,所以尽量保持简单。

有什么建议吗?还是这个游戏的新手。

$table2_query   =   "SELECT * FROM table2";
$table2_result  =   mysql_query($table2_query);
$table2_count   =   mysql_num_rows($table2_result);

    if($table2_count == 0)      {

        if(mysql_error())   {
        echo 'Error: '.mysql_error();   
        }

    }

while($table2_row = mysql_fetch_array($table2_result, MYSQL_ASSOC))     {

    $check_number_length = strlen($table2_row['unique_id']);

        if($check_number_length < 7)    {

            if(substr($table2_row['unique_id'], 0, 2) < 35) {
                $logon_id   = 'n' . $table2_row['unique_id'];
            }else   {
                $logon_id   = 'v' . $table2_row['unique_id'];
            }

        }else   {
            $logon_id   = $table2_row['unique_id'];
        }

    // Set variables for insert query for creation of a new user record
    $first_name     = $table2_row['firstname'];
    $last_name          = $table2_row['lastname'];
    $email_address  = $table2_row['email'];


    $duplicates_query   = "SELECT * FROM table1 WHERE '$logon_id' = logon_id";
    $duplicates_result  = mysql_query($duplicates_query);
    $duplicates_row = mysql_fetch_array($duplicates_result);
    $duplicates_count   = mysql_num_rows($duplicates_result);

        if($duplicates_count == 0)  {

            if(mysql_error())   {
            echo 'Error: '.mysql_error();   
            }

        }else   {
            $update_records_query       =   "UPDATE table1 SET first_name='$first_name', last_name='$last_name', email_address='$email_address'";
            $update_records_result      =   mysql_query($update_records_query);
            $update_records_count       =   mysql_affected_rows();
            echo $update_records_count;
        }

    $create_records_query = "INSERT INTO table1 (first_name, last_name, email_address) VALUES ('$first_name', '$last_name', '$email_address')";
    $create_records_result  =   mysql_query($create_records_query);
    $create_records_count   =   mysql_affected_rows();

        if($create_records_count == 0){

            if(mysql_error()){
                echo 'Error: '.mysql_error();   
            }   
        }

    echo $create_records_count . ' record(s) created.';

}

【问题讨论】:

  • 请做一个“更干净”的样本。
  • 那么,是什么让您无法运行该 DELETE 查询?
  • 对不起@GabrielSantos 试图让它尽可能干净,但想确保一切都可以通过。我已经删除了很多无关的东西,抱歉。
  • if($table2_count == 0) { // SHOW ERROR }之类的事情
  • @Col.Shrapnel 更新之后,我做了一个删除连接查询,以从 table2 中删除与我刚刚插入 table1 的 id 匹配的用户,除非我执行插入时它前面有一个字符table2 中不存在,因此我找不到删除它的记录。希望这是有道理的。

标签: php mysql


【解决方案1】:
 $res = mysql_query ("SELECT count(table1.login_id) AS count FROM table2 LEFT JOIN table1 ON table2.login_id = table1.login_id WHERE table2.login_id = \"".$login_id."\";") or die ("Error joining tables"); 
    /*joins both tables together and selects both id's from tables */

    $row = mysql_fetch_assoc($res); // should only return one row so grab first

    if ($row['count'] > 0) { // check if id exists in both tables (duplicates)
             // updates rows from one table into another
             mysql_query('UPDATE table1,table2 SET table1.username = table2.username, table1.password = table2.password, table1.email = table2.email WHERE table1.login_id = "'.$login_id.'" AND table2.login_id = "'.$login_id.'";') or die ("error updating table1");

            //delete old row
             mysql_query('DELETE FROM table2 WHERE login_id = "'.$login_id.'";') or die("error deleting from table2");


    }else { // if id doesn't exist in table1
            mysql_query ("INSERT INTO table1(username,password,email) SELECT username,password,email FROM table2 where login_id = '".$login_id."';") or die ("error inserting into table1");
    }

去掉table1上login_id开头的n

UPDATE table1 set login_id = replace(login_id,"n","");

如果在 login_id 开头删除 n,则新的更新查询

mysql_query ('UPDATE table1,table2 SET table1.username = table2.username, table1.password = table2.password, table1.email = table2.email WHERE table1.login_id = table2.login_id AND table1.login_id = "'.$login_id.'";');

【讨论】:

  • 谢谢你。我还没有尝试过,但更新、删除和插入真的有效吗? $logon_id 变量将在 table2 中的 logon_id 前面加上一个字符,所以我真的可以使用 WHERE 找到它吗?例如。 table2 登录 id = 123456,table1 是 n123456,脚本将 n 附加到从 table2 中选择的 logon_id 例如n123456 将其与 table1 匹配以进行更新。我可以更新,但我不能回头查看 table2 来删除记录,因为 login_id 现在不同了。
  • 更改了查询,所以试一试并告诉我它是如何工作的还添加了一个查询以从 table1 上的 login_id 中删除 n 如果您选择从中删除 n,最后一个新查询具有更好的性能login_id。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-01-20
  • 2019-01-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-01
  • 2010-11-22
相关资源
最近更新 更多