Sadece inci oluşumunu güncellemek için MySQL mümkün mü?

4 Cevap php

Benim tablo şöyle veri var

  products_parent_id | products_quantity
        2               5
        2               7
        2               9
        2               4

Benim SQL deyimi böylece (şimdiye kadar) gibi görünüyor:

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

Şimdi ne yapmak istediğinizi, güncelleştirme yalnızca products_parent_id 3rd oluşumunu söylüyorlar (olan üstten 3. Bu durumda, 9)

3. tekrarlamasını seçmek için, benim tablolar LIMIT sonunda bu kullanılan ($ notu 1)

MySQL ancak 3rd/4th/etc oluşumunu kullanarak güncelleştirmek için bir yolu var mı? Güvenilir olacak?

Teşekkür ederim

4 Cevap

Kısa Cevap: Hayır

Uzun Cevap:

Sort Of. Because the order the rows are returned is not defined by SQL.
Technically two different requests to the DB could return the rows in a different order. So even if you update the third row, which is the third will depend on the implementation.

Bu azaltmak için tek yol satır belirli bir sipariş uygulamaktır. (Sipariş)

Ben dil şartnamenin parçası olduğunu sanmıyorum ama en SQL uygulamaları bir sorguya belirli bir satır almak için izin verir. Ben MYSQL özel ayrıntıları nelerdir emin değilim ama hızlı bir google bu sayfa var:

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

Sizin soru tamamen açık bu güncelleştirmeyi yapmak için nedenleri yapmaz, ama ben bir DB tabloda örnek girdileri üreten oldum ne zaman hatırlatıyor ve kategori A veya B kategorisi içine bir avuç onları taşımak istedim yok

SQL sorgu bir ORDER BY belirtmez, bu yüzden Martin cevap size aynı sonucu Düzende her zaman alamayabilirsiniz söyleyerek doğrudur. Lütfen ORDER BY belirli bir kimliği dayalı ve bu kimliği sıralı oldu eğer Ancak, modulo her bir üçüncü kaydına erişmek için kullanmak mümkün olacaktır.

Örn:

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)

Bu yöntem sizin için çalışıyorsa, kullandığınız her üçüncü girişini vurmak için güncelleştirme yapabileceği

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

(Id / 3 remainder 0 vardır Update).

Tek tablo başvurusu ile UPDATE kullanırken de ancak ben kendimi bu test değil, LİMİT kelime kullanabilirsiniz.

Source: MySQL Update Syntax

Ayrıca olarak, rekor sayma alt sorgu kullanabilirsiniz

   Update Table T Set
     Col = value 
   Where (Select Count(*) From Table 
          Where products_quantity <= T.products_quantity)
          = 3