2013-08-10 2 views
0

это мой запрос:Невозможно изменить значение при обновлении с РЕГИСТРИРУЙТЕСЬ

$query = "UPDATE ".$SupportTicketsTable." a 
        LEFT JOIN ".$SupportUserTable." b 
         ON b.id=a.operator_id 
        SET 
         a.title=? , 
         a.priority=?, 
         b.solved_tickets= CASE WHEN (a.ticket_status='0' AND b.solved_tickets>=1) THEN (b.solved_tickets-1) ELSE b.solved_tickets END , 
         b.assigned_tickets= CASE WHEN (a.ticket_status='1' AND b.assigned_tickets >=1) THEN (b.assigned_tickets-1) ELSE b.assigned_tickets END , 
         a.ticket_status=?, 
         a.operator_id='0' 
        WHERE a.enc_id=?"; 

Я могу изменить все поля внутри a, но не те, внутри таблицы b, и я не понимаю, почему. Я также проверил, что b.id равно a.operator_id
Это мои таблицы:

CREATE TABLE IF NOT EXISTS `razorphyn_support_list_tickets` (
`id`    BIGINT(15) UNSIGNED  NOT NULL AUTO_INCREMENT, 
`enc_id`   CHAR(87), 
`ref_id`   VARCHAR(18), 
`department_id`  BIGINT(11) UNSIGNED  NOT NULL, 
`operator_id`  BIGINT(11) UNSIGNED  NOT NULL DEFAULT 0, 
`user_id`   BIGINT(11) UNSIGNED  NOT NULL, 
`title`    VARCHAR(255)    NOT NULL, 
`priority`   INT(2)  UNSIGNED  NOT NULL, 
`website`   VARCHAR(200)    NOT NULL, 
`contype`   ENUM('0','1','2','3','4','5') NOT NULL DEFAULT '0', 
`ftp_user`   VARCHAR(60)     NOT NULL, 
`ftp_password`  VARCHAR(60)     NOT NULL, 
`created_time`  DATETIME     NOT NULL, 
`last_reply`  DATETIME     NOT NULL, 
`ticket_status`  ENUM('0','1','2','3')  NOT NULL DEFAULT '2', 
`operator_rate`  DECIMAL(4,2)    UNSIGNED, 
PRIMARY KEY (`id`), 
UNIQUE KEY (`user_id`,`title`), 
INDEX (`enc_id`,`department_id`,`operator_id`,`user_id`,`ticket_status`) 
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=20; 

CREATE TABLE IF NOT EXISTS `razorphyn_support_users` (
`id`    BIGINT(15)  UNSIGNED  NOT NULL AUTO_INCREMENT, 
`name`    VARCHAR(50)      NOT NULL, 
`mail`    VARCHAR(50)      NOT NULL, 
`password`   VARCHAR(200)     NOT NULL, 
`reg_key`   VARCHAR(260)     , 
`tmp_password`  VARCHAR(87)      , 
`ip_address`  VARCHAR(50)      NOT NULL, 
`status`   ENUM('0','1','2','3','4')  NOT NULL DEFAULT '3', 
`holiday`   ENUM('0','1')     NOT NULL DEFAULT '0', 
`mail_alert`  ENUM('no','yes')    NOT NULL DEFAULT 'yes', 
`assigned_tickets` INT(5)   UNSIGNED  NOT NULL DEFAULT 0, 
`solved_tickets` BIGINT(11)  UNSIGNED  NOT NULL DEFAULT 0, 
`number_rating`  BIGINT(6)  UNSIGNED  NOT NULL DEFAULT 0, 
`rating`   DECIMAL(4,2) UNSIGNED  NOT NULL DEFAULT 0, 
PRIMARY KEY (`id`), 
UNIQUE KEY(`mail`), 
INDEX (`name`,`mail`,`status`,`holiday`,`assigned_tickets`,`solved_tickets`) 
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=55; 

и эти пользователи ряд:

(55, 'Admin', mail', 'code', 'code', NULL, '127.0.0.1', '2', '0', 'yes', 0, 0, 1, 4.00), 
(62, 'Mario', 'mail', 'code', 'code', NULL, '87.8.28.216', '1', '0', 'yes', 2, 0, 0, 0.00); 

И это строка билет:

(60, 'enc_id', 'wwZs1amB', 9, 62, 55, 'Bell', 1, '', '0', '', '', '2013-08-10 12:30:48', '2013-08-10 12:30:48', '1', NULL); 

ответ

0

Проблема заключается в том, что MySQL не обновляет одну строку более одного раза в операторе update. Таким образом, вы не «накапливаете» обновления, как вы думаете, этот запрос должен быть.

Кроме того, в одном случае значение в B равно NULL, поэтому вещь будет обновлена.

Вот два альтернативных подхода:

  • Do обновления в двух отдельных отчетах
  • использовать триггеры, чтобы сохранить значения в b последовательно с a.
+0

Возможно, я не удержусь, почему этот запрос работает: 'UPDATE '. $ SupportUserTable." a \t \t \t \t \t INNER JOIN ". $ SupportTicketsTable." б \t \t \t \t \t \t НА b.operator_id = a.id \t \t \t \t \t SET a.rating = ROUND (((a.number_rating * a.rating - (случай, когда b.operator_rate> 0 ТОГДА б. operator_rate еще 0 концов) +?)/(случай, когда a.number_rating = 0, то 1 ИНАЧЕ a.number_rating + 1 END)), 2), \t \t \t \t \t \t a.number_rating = случай, когда b.operator_rate> 0 THEN a.number_rating ELSE a.number_rating + 1 END, \t \t \t \t \t \t b.operator_rate =? \t \t \t \t \t WHERE b.enc_id = ?; 'В чем разница? – Razorphyn

+0

@Dheed. , , Это может быть совпадение. Порядок обновлений в таблице 'b' не определен. Иногда это может быть сделано в правильном порядке, иногда в неправильном порядке. –

+0

Хорошо, спасибо вам большое! – Razorphyn

Смежные вопросы