Bir "sipariş" güncellenmesi en verimli yolu nedir

5 Cevap php

Şu anda Flex ve Zend Framework aracılığıyla Flash CMS oluşturma. Flex arayüzde, ben Zend Framework aracılığıyla MySQL veritabanı çekti sürükle-mümkün öğelerin bir listesi var. Kullanıcı eşlenen Flex dizideki sırasını değiştirmek hangi sürükleyerek ve bırakarak öğeleri yeniden düzenleyebilirsiniz.

Geri sunucuda ben tanıtımı amacıyla ürün 'sıra izler "düzen" olarak adlandırılan benim "ürün" tablosunda bir sütun var. So my question is what is the most efficient way of updating my changes in the "order" column of my database?

Ben sadece tüm dizi yineleme ve her satırda bir güncelleştirme sorgusu çalıştırmak, sayaç / yineleyici değeri sırası değeri güncelleme olabileceğini biliyorum, ama bu biraz çirkin görünüyor, ben her satırı güncelleştirmek gerekiyor ve ben olmayabilir potansiyel MySQL çok hızlı bir şekilde sorgular bir sürü ateş olabilir.

Herhangi bir fikir büyük mutluluk duyacağız.

Seyir için teşekkürler. :)

5 Cevap

Tek bir öğenin hareketini ele ediyorsanız, o zaman iki sorgular, tek bir varlık bunu yapabilirsiniz:

UPDATE items SET `order` = `order` + 1 
  WHERE `order` >= :index_of_inserted_item 
  ORDER BY `order` DESC

MySQL güncelleme sahte yinelenen anahtar hataları önlemek için yüksek değerden başlayarak yapılmalıdır.

Check the following two question out;
Fetching linked list in MySQL database
What is the most efficient/elegant way to parse a flat table into a tree?

Alway tüm listesini almak istiyorsanız, bağlantılı liste uygulamak zorunda.

Eğer tablo kullanıcı bir öğeyi taşır her zaman güncelliyoruz?

Eğer evet ise, o zaman bir olarak linked list olarak veritabanındaki öğelerin sırasını saklayabilirsiniz. Her öğe onun üst bilecek - onun üstüne öğeyi.

The move of one item to some other place will need 3 database updates, which will change the parents. If you have this order of elements : A B C D E and drag B between D and E so you have A C D B E

Yani yerine veritabanında "düzen" sütununda Bir yere kadar olan elemana işaret edecek bir "id_parent" sütunu olurdu. Ve bu örnekte sen yapardın:

UPDATE C set parent = 'A' UPDATE B set parent = 'D' UPDATE E set parent = 'B'

Ben bir dizi orijinal siparişi saklamak istiyorsunuz - Böyle bir POST-değişken olarak örneğin: $ _POST [emir] = array (1,2,3). Kullanıcı gönderir, ben başka bir dizide yeni düzeni saklamak istiyorsunuz. Son olarak, ben önce ve sonra değerleri karşılaştırmak istiyorsunuz, ve farklı oldukları sadece güncelleyin.

Kod örneği:

$before = array(1,2,3);
$after  = array(2,1,3);

for($i=0; $i<count($before); $i++) {
    if($before[$i] !== $after[$i]) {
    	$chg[] = $i;
    }
}

print_r($chg);

Sonuç: Array ([0] => 0 [1] => 1)

Eğer sadece ilk iki satır güncellemeniz gerekir anlamına gelir.

MySQL bir ROWNUM SQL fıkra vardır. Varsa, böyle bir şey işe (veya değil) olabilir:

UPDATE table
SET Order = ROWNUM
WHERE GroupId = Id