php - 使用 IF 语句加载数据本地 infile

标签 php mysql if-statement load-data-infile

我有数据表:

| id  | status |
+-----+--------+
|  1  |    1   |
|  2  |    1   |
|  3  |    0   |
|  4  |    2   |
|  5  |    2   |

我有文件,我需要加载到这个表中并替换:

| id | status |  
+----+--------+
|  1 |    1   |  
|  2 |    0   |  
|  3 |    0   |  
|  4 |    0   |  
|  5 |    1   | 

我有一个条件:如果 status in table =2 且 status in file =0,则保留 status in table =2,否则从文件替换 status in table。
查询后我需要获取新数据:

| id  | status |  
+-----+--------+
|  1  |    1   |  
|  2  |    0   |  
|  3  |    0   |  
|  4  |    2   |  
|  5  |    1   |  

我正在尝试通过查询来做到这一点:

load data local
infile '".$file."'
replace
into table t1
fields terminated by ',' enclosed by '\"'
(@tid, 
teacher_name, 
email,
@pid,   
tca_form_type, 
prod_company, 
prod_name,
@stts)
set status = if((select status from (select status from t1 where teacher_id=@tid and prod_id=@pid) as tmp)=2  and @stts=0,status,@stts),
teacher_id = @tid, prod_id = @pid  

之后我得到状态字段 NULL。
如何解决这个问题?

编辑:
我试过了:

set status = if((select @var:=status from (select status from t1 where teacher_id=@tid and prod_id=@pid) as tmp)=2 and @stts=0,@var,@stts),  

但是结果状态 2 变成了 0。

表架构:

CREATE TABLE `table` (
`id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
`teacher_id` VARCHAR(20) NOT NULL COLLATE 'utf8_unicode_ci',
`status` INT(11) NULL DEFAULT NULL,
`prod_id` VARCHAR(10) NOT NULL COLLATE 'utf8_unicode_ci',
PRIMARY KEY (`id`),
UNIQUE INDEX `teacher_id_UNIQUE` (`teacher_id`, `prod_id`)
)
COLLATE='utf8_unicode_ci'
ENGINE=InnoDB
ROW_FORMAT=COMPACT
AUTO_INCREMENT=2053;

真实数据:

| id  | teacher_id | status | prod_id |
+-----+------------+--------+---------+
|  1  |    a1      |    1   |    15   |
|  2  |    a1      |    1   |    16   |
|  3  |    a1      |    0   |    17   |
|  4  |    a2      |    2   |    16   |
|  5  |    a2      |    2   |    18   |
|  6  |    a3      |    0   |    15   |
|  7  |    a3      |    1   |    20   |

文件数据:

| teacher_id | status | prod_id |
+------------+--------+---------+
|    a1      |    0   |    15   |
|    a1      |    1   |    16   |
|    a1      |    0   |    17   |
|    a2      |    1   |    16   |
|    a2      |    0   |    18   |
|    a3      |    1   |    15   |
|    a3      |    1   |    20   |  

我的临时解决方案:

load data local
                infile '".$file."'
                into table table_tmp
                fields terminated by ',' enclosed by '\"'
                (teacher_id, 
                teacher_name, 
                email,
                prod_id,   
                tca_form_type, 
                prod_company, 
                prod_name,
                status);
INSERT INTO table
                    (teacher_id, teacher_name, email, status, prod_id, tca_form_type, prod_company, prod_name)
                    SELECT teacher_id, teacher_name, email, `status`, prod_id, tca_form_type, prod_company, prod_name FROM table_tmp
                ON DUPLICATE KEY UPDATE table.status = IF(table.status = 2 and VALUES(status) = 0, table.status, VALUES(status));

最佳答案

我认为这应该足够了:

load data local
infile '".$file."'
replace
into table t1
fields terminated by ',' enclosed by '\"'
(@tid, 
teacher_name, 
email,
@pid,   
tca_form_type, 
prod_company, 
prod_name,
@stts)
set status = if(status = 2 and @stts = 0, status, @stts),
teacher_id = @tid, prod_id = @pid;

如果这没有帮助,您可以尝试使用 values() function ,尽管它说它用于 INSERT ... ON DUPLICATE KEY UPDATE 语句。

In an INSERT ... ON DUPLICATE KEY UPDATE statement, you can use the VALUES(col_name) function in the UPDATE clause to refer to column values from the INSERT portion of the statement. In other words, VALUES(col_name) in the UPDATE clause refers to the value of col_name that would be inserted, had no duplicate-key conflict occurred. This function is especially useful in multiple-row inserts. The VALUES() function is meaningful only in the ON DUPLICATE KEY UPDATE clause of INSERT statements and returns NULL otherwise. See Section 13.2.5.3, “INSERT ... ON DUPLICATE KEY UPDATE Syntax”.

如果这也没有帮助,请提供表架构等,这样我们就可以自己尝试,而不必猜测。

关于php - 使用 IF 语句加载数据本地 infile,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27703098/

相关文章:

mysql - 如何制作库存库存基于 Web 的服务..?

python - Concat string if 条件,否则什么都不做

javascript - 返回原始状态的其他返回不起作用

php - 在 PHP 中通过 JSON API 获取 Youtube 订阅者数量

php - mysql 计算唯一的单元格组合,空

php - 从两个不同的表中获取 MySQL 值到一个数组中?

php - mysqli_stmt_bind_result 的奇怪问题

php - 使用 PDO 从特定列和行返回数据

php - mysqli_real_escape_string() 中出错?

sql - 如果数据库存储为空,如何设置显示 0