Загрузка данных локального файла с помощью оператора IF

У меня есть таблица с данными:

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

У меня есть файл, который мне нужно загрузить в эту таблицу и заменить:

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

У меня есть одно условие: если статус в таблице = 2 и статус в файле = 0, оставить статус в таблице = 2, в противном случае заменить статус в таблице из файла.
После запроса мне нужно получить новые данные:

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

3

Решение

Я думаю, что этого должно быть достаточно:

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() функция, хотя он говорит, что это для INSERT ... ON DUPLICATE KEY UPDATE заявление.

В операторе INSERT … ON DUPLICATE KEY UPDATE вы можете использовать функцию VALUES (col_name) в предложении UPDATE для ссылки на значения столбцов из части INSERT инструкции. Другими словами, VALUES (col_name) в предложении UPDATE относится к значению col_name, которое было бы вставлено, если бы не произошло конфликта дублирующихся ключей. Эта функция особенно полезна в многострочных вставках. Функция VALUES () имеет смысл только в условии ON DUPLICATE KEY UPDATE операторов INSERT и в противном случае возвращает NULL. См. Раздел 13.2.5.3, «ВСТАВИТЬ … В СИНТАКСИС ОБНОВЛЕНИЯ КЛЮЧЕВЫХ КЛЮЧЕЙ».

Если это тоже не поможет, пожалуйста, предоставьте схему таблицы и так далее, чтобы мы могли попробовать сами, и не нужно угадывать.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]