Возможно ли в MySQL обновлять только n-е вхождение?

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

  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']

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

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

Есть ли способ ОБНОВЛЕНИЯ с использованием MySQL, но только в случае 3-го / 4-го и т.д.? Будет ли это надежно?

Спасибо

Имейте в виду, что строки действительно не имеют порядка ни в одной базе данных SQL, они просто сохраняют его. Если вы не выполняете ORDER BY и не имеете какой-либо столбец RANK, это может быть опасно для больших или часто используемых баз данных.

TravisO 08.01.2009 20:16
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
0
1
1 528
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

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

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

Похоже, здесь LIMIT может ограничивать только количество затронутых строк, но не влияет на n-е вхождение.

alex 08.01.2009 04:27

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

   Update Table T Set
     Col = value 
   Where (Select Count(*) From Table 
          Where products_quantity <= T.products_quantity)
          = 3
Ответ принят как подходящий

Короткий ответ: нет

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

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

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

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

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

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

В вашем 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).

Моя причина, к сожалению, связана с плохо спроектированной и взломанной osCommerce, в которую мне пришлось внести поправки. Я работал над решением, сначала ВЫБИРАЯ тот, который мне нужен, взял его product_id, а затем использовал UPDATE. Неэффективно, но в данном случае работает. Спасибо за подробный ответ :)

alex 11.01.2009 16:49

Другие вопросы по теме