В таблице есть пары совпадающих записей, нужно выбрать и обновить только одну запись - PullRequest
2 голосов
/ 17 мая 2011

У меня есть таблица с парами совпадающих записей, которые я запрашиваю следующим образом:

select id,name,amount,type from accounting_entries 
  where name like "%05" and amount != 0 order by name limit 10;

Результаты:

+------+----------------------+--------+-------+
| id   | name                 | amount | type  |
+------+----------------------+--------+-------+
|  786 | D-1194-838HELLUJP-05 |  -5800 | DEBIT | 
|  785 | D-1194-838HELLUJP-05 |  -5800 | DEBIT | 
| 5060 | D-1195-UOK4HS5POF-05 |  -5000 | DEBIT | 
| 5059 | D-1195-UOK4HS5POF-05 |  -5000 | DEBIT | 
|  246 | D-1196-0FUCJI66BX-05 |  -7000 | DEBIT | 
|  245 | D-1196-0FUCJI66BX-05 |  -7000 | DEBIT | 
| 9720 | D-1197-W2J0EC1BOB-05 |  -6500 | DEBIT | 
| 9719 | D-1197-W2J0EC1BOB-05 |  -6500 | DEBIT | 
| 2694 | D-1198-MFKIKHGW0S-05 |  -5500 | DEBIT | 
| 2693 | D-1198-MFKIKHGW0S-05 |  -5500 | DEBIT | 
+------+----------------------+--------+-------+
10 rows in set (0.01 sec)

Мне нужно выполнить обновление, чтобы результирующие данные быливыглядеть следующим образом:

+------+----------------------+--------+--------+
| id   | name                 | amount | type   |
+------+----------------------+--------+--------+
|  786 | D-1194-838HELLUJP-05 |  -5800 | DEBIT  | 
|  785 | C-1194-838HELLUJP-05 |   5800 | CREDIT | 
| 5060 | D-1195-UOK4HS5POF-05 |  -5000 | DEBIT  | 
| 5059 | C-1195-UOK4HS5POF-05 |   5000 | CREDIT | 
|  246 | D-1196-0FUCJI66BX-05 |  -7000 | DEBIT  | 
|  245 | C-1196-0FUCJI66BX-05 |   7000 | CREDIT | 
| 9720 | D-1197-W2J0EC1BOB-05 |  -6500 | DEBIT  | 
| 9719 | C-1197-W2J0EC1BOB-05 |   6500 | CREDIT | 
| 2694 | D-1198-MFKIKHGW0S-05 |  -5500 | DEBIT  | 
| 2693 | C-1198-MFKIKHGW0S-05 |   5500 | CREDIT | 
+------+----------------------+--------+--------+
10 rows in set (0.01 sec)

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

Любые подсказки о том, как это сделать?Как будет выглядеть команда обновления?Может быть, с помощью предложения group by?У меня есть некоторые идеи о том, как сделать это с помощью хранимой процедуры, но могу ли я сделать это с помощью простого обновления?

Ответы [ 3 ]

4 голосов
/ 17 мая 2011

Попробуйте это:

UPDATE accounting_entries as ae
SET    name = 'C' + SubString(name, 1, Length(name) - 1))
       amount = amount * -1
       type = 'Credit'    
WHERE  id = 
         (SELECT MIN(id) FROM 
            (SELECT * FROM accounting_entries) as temp
          GROUP BY name)

Ключ - это подзапрос в разделе WHERE, который ограничивает обновления самым низким идентификатором каждого значения имени.Предполагается, что нижний идентификатор - это тот, который вы всегда хотите обновить.Если это не так, то обновите подзапрос на основе того правила, которое вы бы использовали.

Редактировать : Обновление подзапроса на основе найденной техники здесь из-за ограниченийдля mysql определено здесь .

Этот запрос дает метод для обновления всех записей одновременно (как казалось, что это то, что ищет OP. Однако наиболее эффективный способ сделатьэто должно было бы перечислять все записи в коде (php, asp.net и т. д.) и обновлять строки, которые необходимо изменить, с помощью методов на основе кода, что устраняло бы проблемы с производительностью, присущие запуску обновлений из подзапросов в mysql.

1 голос
/ 17 мая 2011

Если ID: s для пары всегда соответствуют формуле x и x + 1, вы могли бы сказать что-то вроде

WHERE MOD(`id`, 2) = 1

РЕДАКТИРОВАТЬ: я не проверял этот код, поэтому я не могугарантировать, что в мод можно поместить имя столбца, но это стоит попробовать и / или провести дальнейшее исследование.

0 голосов
/ 17 мая 2011

Является ли это ограничение истинным все время (D == -C)?

Если это так, вам не нужно хранить избыточные данные в вашей таблице, сохраняйте только одно значение «сумма» (например, дебет)):

786 | 1194-838HELLUJP-05 | -5800

, а затем на уровне приложения добавьте D- к name и получите необработанный amount или добавьте C- и получите- amount.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...