Возможно ли в MySQL обновить только n-й случай? - PullRequest
0 голосов
/ 08 января 2009

В моей таблице есть такие данные

  products_parent_id | products_quantity
        2               5
        2               7
        2               9
        2               4  

Мой оператор SQL выглядит так (пока):

UPDATE ' . TABLE_PRODUCTS . ' SET products_quantity = products_quantity +' . $order['products_quantity'] . ', products_ordered = products_ordered - ' . $order['products_quantity'] . ' WHERE products_parent_id = ' . (int)$order['products_id']

Теперь то, что я хочу сделать, это обновить, скажем, только 3-е вхождение products_parent_id (в данном случае, 3-е сверху сверху 9)

Чтобы ВЫБРАТЬ 3-е вхождение, я использовал это в конце своих утверждений LIMIT ($ grade, 1)

Есть ли способ ОБНОВИТЬ использование MySQL, но только 3-е / 4-е / etc вхождение? Будет ли это надежным?

Спасибо

Ответы [ 4 ]

5 голосов
/ 08 января 2009

Краткий ответ: Нет

Длинный ответ:

В некотором роде. Поскольку порядок возвращаемых строк не определяется SQL.
Технически два разных запроса к БД могут возвращать строки в другом порядке. Таким образом, даже если вы обновите третью строку, третья будет зависеть от реализации.

Единственный способ смягчить это - применить определенный порядок к строкам. (Заказ по)

Я не думаю, что это является частью спецификации языка, но большинство реализаций SQL позволяют вам получить конкретную строку из запроса. Я не уверен, каковы конкретные детали MYSQL, но быстрый Google получил эту страницу:

http://forums.mysql.com/read.php?10,36490,36511

2 голосов
/ 10 января 2009

Ваш вопрос не дает четкого объяснения причинам, по которым вы сделали это обновление, но напоминает мне о том, когда я генерировал примеры записей в таблице БД и хотел переместить их в категорию А или категорию В. .

В вашем запросе SQL не указан ORDER BY, поэтому правильный ответ Мартина состоит в том, что вы не можете каждый раз получать один и тот же порядок результатов. Однако, если ваш ORDER BY был основан на определенном идентификаторе, и этот идентификатор был последовательным, вы могли бы использовать по модулю для доступа к каждой третьей записи.

Например:

mysql> create table foo ( id int ) ;
Query OK, 0 rows affected (0.01 sec)

mysql> insert into foo values (1), (2), (3), (4), (5), (6), (7), (8), (9), (10), (11), (15) ;
Query OK, 12 rows affected (0.00 sec)
Records: 12  Duplicates: 0  Warnings: 0

mysql> select * from foo where id%3=0;
+------+
| id   |
+------+
|    3 | 
|    6 | 
|    9 | 
|   15 | 
+------+
4 rows in set (0.00 sec)

Если этот метод работает для вас, вы можете выполнить обновление для каждой третьей записи, используя

UPDATE [ ... ] WHERE id % 3 = 0 ;

(Обновление, где id / 3 имеет остаток из 0).

0 голосов
/ 08 января 2009

Вы также можете использовать подзапрос подсчета записей, как в

   Update Table T Set
     Col = value 
   Where (Select Count(*) From Table 
          Where products_quantity <= T.products_quantity)
          = 3
0 голосов
/ 08 января 2009

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

Источник: Синтаксис обновления MySQL

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