Как я могу обновить значения в таблице MySQL, если другие значения являются дубликатами? - PullRequest
3 голосов
/ 13 марта 2012

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

tbl1

COL1 COL2 COL2
---- ---- ----
A    B    1
B    C    3
A    C    11
A    D    13
B    D    10

Как я могу обновить col3, если значения в col1 являются дубликатами?

Я хочу, чтобы значения в столбце col3 были обновлены с наибольшим найденным.

Получившаяся таблица будет выглядеть так:

COL1 COL2 COL2
---- ---- ----
A    B    13
B    C    10
A    C    13
A    D    13
B    D    10

Заранее спасибо !!!

Ответы [ 3 ]

1 голос
/ 13 марта 2012

С обновлением, объединенным с желаемыми данными. Коррелированные подзапросы недопустимы :

update T inner 
join ( select c1, max( c3) as m from T) T2 
on T.c1 = T2.c1 
set T.c3 = T2.m;

Проверено:

mysql> create table T ( c1 char(1), c3 int ) ;
Query OK, 0 rows affected (0.15 sec)

mysql> insert into T values ( 'A', 1),('B',3),('A',11),('A',13);
Query OK, 4 rows affected (0.02 sec)
Records: 4  Duplicates: 0  Warnings: 0

mysql> select * From T;
+------+------+
| c1   | c3   |
+------+------+
| A    |    1 |
| B    |    3 |
| A    |   11 |
| A    |   13 |
+------+------+


mysql> update T inner join ( select c1, max( c3) as m from T) T2 
on T.c1 = T2.c1 set T.c3 = T2.m;
Query OK, 2 rows affected (0.07 sec)
Rows matched: 3  Changed: 2  Warnings: 0

mysql> select * from T;
+------+------+
| c1   | c3   |
+------+------+
| A    |   13 |
| B    |    3 |
| A    |   13 |
| A    |   13 |
+------+------+
4 rows in set (0.00 sec)
1 голос
/ 13 марта 2012

Во-первых, давайте загрузим ваши данные образца

mysql> drop database if exists dilyan_kn;
Query OK, 1 row affected (0.04 sec)

mysql> create database dilyan_kn;
Query OK, 1 row affected (0.00 sec)

mysql> use dilyan_kn
Database changed
mysql> create table TBL1
    -> (col1 char(1),col2 char(1),col3 int);
Query OK, 0 rows affected (0.11 sec)

mysql> insert into TBL1 values
    -> ( 'A' , 'B' ,  1 ),
    -> ( 'B' , 'C' ,  3 ),
    -> ( 'A' , 'C' , 11 ),
    -> ( 'A' , 'D' , 13 ),
    -> ( 'B' , 'D' , 10 );
Query OK, 5 rows affected (0.06 sec)
Records: 5  Duplicates: 0  Warnings: 0

mysql> select * from TBL1;
+------+------+------+
| col1 | col2 | col3 |
+------+------+------+
| A    | B    |    1 |
| B    | C    |    3 |
| A    | C    |   11 |
| A    | D    |   13 |
| B    | D    |   10 |
+------+------+------+
5 rows in set (0.00 sec)

mysql>

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

Пример

Для col1 = A у вас есть различные значения 1, 11 и 13. 13 является самым высоким

Для col1 = B у вас есть различные значения 3 и 10. 10 является самым высоким

Вам потребуется подзапрос, который находит наибольшее значение col3 для любого заданного col1.

Вот этот запрос:

SELECT col1,MAX(col3) maxcol3
FROM TBL1 GROUP BY col1;

Запустим этот подзапрос

mysql> SELECT col1,MAX(col3) maxcol3
    -> FROM TBL1 GROUP BY col1;
+------+---------+
| col1 | maxcol3 |
+------+---------+
| A    |      13 |
| B    |      10 |
+------+---------+
2 rows in set (0.00 sec)

mysql>

Давайте использовать этот подзапрос, чтобы СОЕДИНИТЬСЯ со всей таблицей и обновлять столбец col3 всякий раз, когда столбец col1 подзапроса совпадает со столбцом col1 таблицы. Вот этот запрос:

UPDATE
(
    SELECT col1,MAX(col3) maxcol3
    FROM TBL1 GROUP BY col1
) A
INNER JOIN TBL1 B USING (col1)
SET B.col3 = A.maxcol3;

Давайте запустим этот запрос UPDATE JOIN и выберем все TBL1

mysql> UPDATE
    -> (
    ->     SELECT col1,MAX(col3) maxcol3
    ->     FROM TBL1 GROUP BY col1
    -> ) A
    -> INNER JOIN TBL1 B USING (col1)
    -> SET B.col3 = A.maxcol3;
Query OK, 3 rows affected (0.05 sec)
Rows matched: 5  Changed: 3  Warnings: 0

mysql> select * from TBL1;
+------+------+------+
| col1 | col2 | col3 |
+------+------+------+
| A    | B    |   13 |
| B    | C    |   10 |
| A    | C    |   13 |
| A    | D    |   13 |
| B    | D    |   10 |
+------+------+------+
5 rows in set (0.00 sec)

mysql>

Миссия выполнена !!!

Причина, по которой 5 строк совпали, но только 3 изменились, связана с тем, что строки, у которых (col1, col3) (A, 13) и (B, 10) уже имеют максимальные значения и don не нужно менять.

1 голос
/ 13 марта 2012

Вы можете выбрать наибольшее значение из COL3 в подзапросе и выполнить запрос на обновление таблицы со значением из подзапроса

UPDATE TBL1 SET COL3 = (SELECT COL3 FROM TBL1 WHERE COL1 = 'A' ORDER BY COL3 DESC LIMIT 0,1) AS a WHERE COL1 = 'A'
...