В моей таблице есть такие данные
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-го и т.д.? Будет ли это надежно?
Спасибо






Вы также можете использовать ключевое слово LIMIT при использовании UPDATE со ссылкой на одну таблицу, однако я сам не тестировал это.
Источник: Синтаксис обновления MySQL
Похоже, здесь LIMIT может ограничивать только количество затронутых строк, но не влияет на n-е вхождение.
Вы также можете использовать подзапрос подсчета записей, как в
Update Table T Set
Col = value
Where (Select Count(*) From Table
Where products_quantity <= T.products_quantity)
= 3
Короткий ответ: нет
Длинный ответ:
Вроде, как бы, что-то вроде. Поскольку порядок, в котором возвращаются строки, не определяется SQL.
.
Технически два разных запроса к БД могут возвращать строки в другом порядке. Таким образом, даже если вы обновите третью строку, которая будет третьей, будет зависеть от реализации.
Единственный способ смягчить это - применить к строкам определенный порядок. (Сортировать по)
Я не думаю, что это часть спецификации языка, но большинство реализаций SQL позволяют вам получить конкретную строку из запроса. Я не уверен, каковы конкретные детали MYSQL, но быстрый Google получил эту страницу:
Ваш вопрос не совсем ясно объясняет причины, по которым вы делаете это обновление, но он напоминает мне, когда я создавал образцы записей в таблице БД и хотел переместить несколько из них в категорию 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. Неэффективно, но в данном случае работает. Спасибо за подробный ответ :)
Имейте в виду, что строки действительно не имеют порядка ни в одной базе данных SQL, они просто сохраняют его. Если вы не выполняете ORDER BY и не имеете какой-либо столбец RANK, это может быть опасно для больших или часто используемых баз данных.