Kimlikleri listesinde dayalı kayıtların özel sipariş?

2 Cevap php

Ben MySQL bir 'kullanıcı' tablo var

Kullanıcıların benim app giriş yaptığınızda, diğer tüm kullanıcıların listesini görebilir ve bazı javascript-sürükle-bırak yoluyla Biz bu emri kaydetmek istiyorum in diğer kullanıcıların görünen sipariş hangi sağlayabilir.

Ve onların kayıt (yani 'order_pref' = 4,3,5,23 ... onlar belirtilen sırayla user_ids listesi) kaydedilir.

Yani sorun yok ama .. görüntüleniyor gelince ben sadece bir sorgu kullanarak user_ids bu virgülle ayrılmış listesi dayalı sıralayabilirsiniz kolay bir yolu var mı?

2 Cevap

Sen MySQL olamaz. Makul Eğer PHP yapabilirsiniz ama bu sorunu modellemek için en iyi yol değildir.

Sen bir sipariş numarası atamak ve sonra sıralama bu ziyade bir sabit sipariş kimliklerini saklamak gerekir. Varsayarsak:

  • Kullanıcı oturum açan 302 olduğunu
  • Kullanıcı kimliklerinin listesi 11, 432, 788, 343 vardır

Saklamak:

UserID  OrderNum  UserDisplay
 302      100       11
 302      200      432
 302      300      788
 302      400      343

Ve sonra bir sorun haline gelir:

SELECT UserDisplay
FROM UserOrder
WHERE UserID = 302
ORDER BY OrderNum

Much basittir. Şimdi sırasını değiştirerek OrderNum alanını güncelleme gerektirir. Ben 1 adım yapmadım nedeni budur. Bunun yerine sadece OrderNum 150 ayarlamak ikinci sıraya 343 taşımak istiyorsanız. Yüzden muhtemelen çok daha geniş aralıklarla yapmak (örneğin 1000000 verebilecek 100 adımları yaptım ) ve çok nadiren bu değerleri yeniden numaralandırmak gerekebilir.

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.