Обновление каждой строки отдельно - PullRequest
3 голосов
/ 23 июня 2011

Я пытаюсь обновить некоторые строки в моей базе данных.

У меня есть таблица, подобная следующей:

id | subid | creation_date

1  | 1/1   | 2011-06-23

1  | 1/2   | 0000-00-00

2  | 2/1   | 2011-06-20

2  | 2/2   | 0000-00-00

Что я хочу, чтобы обновить записи, имеющие набор creation_dateна "0000-00-00" с датой создания того, у кого есть реальная дата.

Результат после запроса будет:

id | subid | creation_date

1  | 1/1   | 2011-06-23

1  | 1/2   | 2011-06-23

2  | 2/1   | 2011-06-20

2  | 2/2   | 2011-06-20

Может у кого-то есть идеяпомочь мне ?Ил бы сделать это с помощью одного запроса.

Спасибо;)

B.

Ответы [ 5 ]

4 голосов
/ 23 июня 2011

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

CREATE TEMPORARY TABLE foo SELECT id, MAX(creation_date) FROM yo_table GROUP BY id;
UPDATE yo_table SET creation_date = ( SELECT foo.creation_date FROM foo WHERE foo.id = yo_table.id ) 
WHERE creation_date = '0000-00-00';
1 голос
/ 23 июня 2011
update table_a as t1, table_a as t2
set t1.creation_date=t2.creation_date
where t1.id=t2.id and (t1.creation_date=0 and t2.creation_date>0);
1 голос
/ 23 июня 2011
update yo_table outter
set creation_date = 
    (select min(creation date) from yo_table iner where iner.id = outter.id)
where creation_date = '0000-00-00' --note that you'll have to edit this according to the data type of your creation_date column

Редактировать: с темп. таблица

create table yo_table_tmp as select * from yo_table;

    update yo_table outter
    set creation_date = 
        (select min(creation date) from yo_table_tmp iner where iner.id = outter.id)
    where creation_date = '0000-00-00' --note that you'll have to edit this according to the data type of your creation_date column
;

drop table yo_table_tmp;
0 голосов
/ 23 июня 2011

Я думаю, что это должно работать для вас:

UPDATE `tableA` `ta`
INNER JOIN (
    SELECT `id`, `creation_date`
    FROM `tableA`
    WHERE `creation_date` > '0000-00-00'
    GROUP BY id
) `tb` ON `ta`.`id` = `tb`.`id`
SET `ta`.`creation_date` = `tb`.`creation_date`
WHERE `ta`.`creation_date` = '0000-00-00';

Надеюсь, это поможет.

0 голосов
/ 23 июня 2011

Создать временную таблицу.

Я изменил ваш subid для простоты, вы всегда можете объединить их в результате запроса.

mysql> update table1 set creation_date = (SELECT x.creation_date
    from (SELECT * from table1 WHERE subid=1) AS X
    WHERE x.id =table1.id) WHERE subid=2;

Query OK, 2 rows affected (0.00 sec)
Rows matched: 2  Changed: 2  Warnings: 0

mysql> select * from table1;
+----+-------+---------------+
| id | subid | creation_date |
+----+-------+---------------+
|  1 |     1 | 2011-06-23    |
|  1 |     2 | 2011-06-23    |
|  2 |     1 | 2011-06-20    |
|  2 |     2 | 2011-06-20    |
+----+-------+---------------+
4 rows in set (0.00 sec) 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...