MySQL tabanlı web uygulaması: Kullanıcıların sipariş veya öğeleri seçmek için kolay yolu?

6 Cevap php

Ben kullanıcıların öğeleri yeniden düzenleyerek bir şey üzerinde çalışıyorum ve daha sonraki bir zamanda, bu öğeler seçilen sırayla görüntülenen gerekir. Basit bir örnek olarak, öğelerin bir listesini göz önünde bulundurun:

A, B, C, D, E, F, G.
The MySQL table would be something simple: user_id, letter, sortnumber

Kullanıcı artan adımlarla sırasını değiştirmek için izin verilir. Onlar Buna ek olarak, öğeleri ekleyebilir ve kaldırabilirsiniz, vb başına, sonra D, G bir hareket olabilir. Böylece C, silebilir veya bu adımların her birinde X ekleyebilir, bunu işlemek, ve MySQL öğeleri ayarlamak, hangi PHP veri gönderebilir.

Ben bu konuda gidiş görmek iki yolu vardır:

  1. Each time they add/remove/reorder something, send the entire list to PHP, delete all the data they previous had in there, and just insert the new list. Problem is, this is a lot of deletions/insertions each time they do anything. They might move A to after B, and then suddenly I delete 7 records, and insert 7 more. On the plus side, it's dead simple.
  2. Her bir "hareket" Onlar (örn: bir eklenti ya da bir kaldır, ya da bir sipariş) yapmak, bunun için bilgi göndermek. EG, onlar F sonra A taşındı, ve ben şimdi sonra A ve (F dahil) F arasındaki tüm "sortnumber" azaltma var, A ve F hem de listede var olduğunu kontrol etmek gerekir "F sonra hareket bir" söyle. Onlar "Z sil" derseniz onu silmek, listede bulmak zorunda, ve ondan sonra tüm kayıtları sortnumbers azaltma.

Ben sadece merak ediyorum ... Herkes nerede sipariş konularda bir şey ile uğraşmak zorunda kaldı, ve eğer öyleyse, bu konuda nasıl gitti?

6 Cevap

Tabloya bir sıra sütun ekle - Bir kayan noktalı sayı olarak.

Bir öğe Satır-A ve Satır-B arasında taşındığında bu komşu sütunların Ortalama kendi sıra numarasını ayarlayın

Endeks sıra sütunu :)

Kullanıcı, öğelerin yeni düzeni kaydetmek için bu eski düzene yeni bir düzen karşılaştırmak ve bunları sadece sortnumber değişti olanlar güncelleştirmeleri gerçekleştirmek istiyor. Onlar bir öğeyi silerseniz, sortnumber s aşağı kaydırmaya gerek yok. Eğer ortada eksik olan bir sayı ile bir listeyi sıralamak, hala doğru sırayla olacaktır.

Dizinin son sırası önemli sadece bir tanesidir. Belirli bir sipariş almak için yaklaşık altı öğeleri taşımak, gerçekten listenin dizisi başlamak ve ne işiniz bittiğinde gibi ne zaman nasıl oldu arasındaki noktalarda nedir bakım gerekmez.

Ekle ve sıralamada önemsemeden öğeleri kaldırmak ve daha sonra "Sıralama Kaydet", diyor bir düğmeye tıkladığınızda sıra değerini ayarlamak için öğeleri güncelleştirmek.

Bu size iki avantaj sağlar:

  • Bu çok daha az yük de daha hızlı olacak demektir bir öğeyi değiştirmek her zaman.
  • Bu sırasını ayarlamak için ölü basit - yapmanız gereken tüm dizisi değeri 0'dan başlayıp yukarı gidiyor güncellenmesi, istenilen sırayla öğe kimlikleri bir listesini gönderir ve daha sonra üzerinde yineleme olduğunu.

Here's the same answer I gave to Thomaschaaf's question:

This is not and easy problem. If you have a low number of sortable elements, I would just reset all of them to their new order.

Otherwise, it seems it would take just as much work or more to "test-and-set" to modify only the records that have changed.

You could delegate this work to the client-side. Have the client maintain old-sort-order and new-sort-order and determine which row[sort-order]'s should be updated - then passes those tuples to the PHP-mySQL interface.

You could enhance this method in the following way (doesn't require floats):

  1. If all sortable elements in a list are initialized to a sort-order according to their position in the list, set the sort-oder of every element to something like row[sort-order] = row[sort-order * K] where K is some number > average number of times you expect the list to be reordered. O(N), N=number of elements, but increases insertion capacity by at least N*K with at least K open slots between each exiting pair of elements.

  2. Then if you want to insert an element between two others its as simple as changing its sort-order to be one that is > the lower element and < the upper. If there is no "room" between the elements you can simply reapply the "spread" algorithm (1) presented in the previous paragraph. The larger K is, the less often it will be applied.

The K algorithm would be selectively applied in the PHP script while the choosing of the new sort-order's would be done by the client (Javascript, perhaps).

Birincil anahtarı ve her öğe için bir sortnumber var. Eğer birincil anahtarlar dahil olmak bir php dizi varsa, siz) (array_splice kullanarak diziye öğeler ve insert öğeleri kaldırabilirsiniz.

// base array
$items = array( 7, 11, 9, 4, 5);
// remove item 11
array_splice($items, array_search(11), 1);
// insert 11 before item 4
array_splice($items, array_search(4), 0, 11);
// input now contains 7, 9, 11, 4, 5

Birincil anahtarlar ile sıralama dizi ve güncelleştirmesi aracılığıyla sonra döngü

$i = 0;
foreach($items as $item) {
  // UPDATE item_table SET sorting = '$i' WHERE id = '$item';
  i++;
}

Sadece başka bir sütun ekleyin. Çağrı order.

Sen satır ve her satır sırası bir id veya birincil anahtarı olan var. Sadece satır bir defada bir geçmesi, ve gitmek gibi sırasını ayarlayın. Yani:

UPDATE item_table SET order = 0 WHERE id="fred";
UPDATE item_table SET order = 1 WHERE id="larry";
UPDATE item_table SET order = 2 WHERE id="john";
UPDATE item_table SET order = 3 WHERE id="sydney";

Ben matematiksel olarak bunu yapmanın hile yolu vardır eminim, ama bazen basit cevaplar en iyisidir.

Sonra bir sorgu eklenti yaptığınızda SORT BY order.