Bunu yapabileceğiniz bir kaç yolu var, en iyi durumda, kullanıcıya özel sipariş için ikinci bir tablo ile bunu yapmak için. Kullanıcı tabloya tek bir sütun ekleyerek, her kullanıcı kendi sıralamasını olacak gibi muhtemelen çalışmaz.
App ölçek ve karmaşıklığına bağlı olarak, tek bir tablo ile bunu (daha yönetilebilir, ancak daha yavaş milyonlarca kullanıcı ile), ya da (daha fazla ölçeklenebilir) her kullanıcı için tablolar oluşturabilirsiniz. Aşağıdaki örneklerde, mevcut kullanıcı sipariş 4,3,5,23 olan veya kullanıcı # 2'dir.
create table if not exists user_ordering (
owner_id integer unsigned not null,
user_id integer unsigned not null,
order_index integer not null default '0',
unique owner_user (user_id,owner_id),
index owner_idx (owner_id,order_index)
) ENGINE=MyISAM;
Bir sipariş kaydetmek için, sırayla takın:
INSERT INTO user_ordering (owner_id,user_id,order_index) VALUES (2,4,0);
INSERT INTO user_ordering (owner_id,user_id,order_index) VALUES (2,3,1);
INSERT INTO user_ordering (owner_id,user_id,order_index) VALUES (2,5,2);
INSERT INTO user_ordering (owner_id,user_id,order_index) VALUES (2,23,3);
Seçmek sadece katılmak değil listedeki kullanıcılar için bir "varsayılan" bir tür kullanmak için:
SELECT U.* FROM user U
LEFT OUTER JOIN user_ordering G ON U.id=G.user_id AND G.owner_id=2
ORDER BY G.order_index,U.name;
Eğer biraz zaman kazanmak istiyorsanız, bir "sahibi-by-sahibi" temelinde gerçekleşmesi artan neden otomatik artmasını ile bir çift birincil anahtar kullanabilir, örneğin
create table if not exists user_ordering (
owner_id integer unsigned not null,
user_id integer unsigned not null,
order_index integer not null AUTO_INCREMENT,
unique owner_user (user_id,owner_id),
PRIMARY KEY (owner_id,order_index)
) ENGINE=MyISAM;
Eğer güncellemek için bir liste verilmiş iseniz, hızlı-ve-kirli yapabilirdi:
DELETE FROM user_ordering WHERE owner_id=2;
INSERT INTO user_ordering (owner_id,user_id) VALUES (2,4);
INSERT INTO user_ordering (owner_id,user_id) VALUES (2,3);
INSERT INTO user_ordering (owner_id,user_id) VALUES (2,5);
INSERT INTO user_ordering (owner_id,user_id) VALUES (2,23);
Hatta birden insert sürümünü kullanmak mümkün olabilir:
DELETE FROM user_ordering WHERE owner_id=2;
INSERT INTO user_ordering (owner_id,user_id) VALUES (2,4),(2,3),(2,5),(2,23);
Büyük veritabanları için, sizin gibi, kullanıcı başına tek bir tablo oluşturmak için daha iyi yapabilir:
create table if not exists user_ordering_2 (
user_id integer unsigned not null,
order_index integer not null AUTO_INCREMENT,
unique owner_user (user_id),
PRIMARY KEY (order_index)
) ENGINE=MyISAM;
Bu tarihe kadar şema kadar tutmak için biraz daha gelişmiş araçlar gerektirir, ancak daha iyi ölçek olacaktır.