Yeni bir öğe için sırasını belirlemek nasıl?

6 Cevap php

Ben MySQL bir üye tablo var

CREATE TABLE  `members` (
  `id` int(10) unsigned NOT NULL auto_increment,
  `name` varchar(65) collate utf8_unicode_ci NOT NULL,
  `order` tinyint(3) unsigned NOT NULL default '0',
  PRIMARY KEY  (`id`)
) ENGINE=InnoDB;

And I would like to let users order the members how they like. I'm storing the order in order column.

I'm wondering how to insert new user to be added to the bottom of the list. This is what I have today:

$db->query('insert into members VALUES (0, "new member", 0)');
$lastId = $db->lastInsertId();
$maxOrder = $db->fetchAll('select MAX(`order`) max_order FROM members');
$db->query('update members 
            SET 
                `order` = ?
            WHERE 
                 id = ?', 
           array(
               $maxOrder[0]['max_order'] + 1, 
               $lastId
        ));

Aynı zamanda yeni üye ekleme birçok kullanıcı olduğunda, bu MAX(order) aynı değerleri dönecektir meydana gelebilecek süre Ama bu gerçekten kesin değil.

Nasıl böyle durumlarda ele?

6 Cevap

Sen gibi INSERT, bir parçası olarak SEÇİMİ yapabilirsiniz:

INSERT INTO members SELECT 0, "new member", max(`order`)+1 FROM members;

SELECT parçası optimize yapmak için order sütun üzerinde bir dizin var istediğiniz gidiyoruz unutmayın.

Buna ek olarak, size sadece sadece hiç 255 emir olmasını beklediğiniz sürece, sipariş için tinyint yeniden isteyebilirsiniz.

Ayrıca sipariş ayrılmış bir sözcüktür ve her zaman \ order\ olarak yazmak gerekir, bu yüzden de bu sütunu yeniden adlandırma düşünebilirsiniz.

Zaten otomatik olarak her yeni üye için id artırmak olduğundan, id tarafından sipariş edebilirsiniz.

Ben anladığımdan emin değilim. Her kullanıcının nasıl "üyeler" tablosundaki tek alanda bireysel kullanıcı tercihlerini saklamak olacak farklı bir düzen istiyorsa?

Genellikle sadece kullanıcıların alanların doğal sırasına göre sipariş edelim. Sipariş alanın amacı nedir?

Genellikle "düzen, adı" tüm benim seçin tablolar sipariş yapmak; Sonra hep Order (Ben bunları ilk veya son isterseniz göre 0 veya 9999999 ya) için aynı değeri ekleyebilirsiniz. Sonra kullanıcı, ancak onlar gibi yeniden düzenleyebilirsiniz.

InnoDB işlemleri destekler. Insert bir 'başlamak' deyimi yapmak ve zaman önce bitmiş bir taahhüt yok. MySql işlemlerin bir açıklama için this article bakın.

Neler yapabileceğini başka member_id eşleyen tuşları (member_id, pozisyon) olan bir tablo oluşturmaktır. Sonra üye listesinden kendisinden ayrı bu tablodaki sipariş saklayabilirsiniz. (Her üye ... Ne istediğinizi varsayalım ne olduğu, kendi liste sıralamasını korur?)

Eğer böyle bir üye tablo olduğunu düşünürsek:

+-----------+--------------+
| member_id | name         |
+-----------+--------------+
|         1 | John Smith   |
|         2 | John Doe     |
|         3 | John Johnson |
|         4 | Sue Someone  |
+-----------+--------------+

Sonra, böyle bir sipariş tablo olabilir:

+---------------+----------+-----------------+
| member_id_key | position | member_id_value |
+---------------+----------+-----------------+
|             1 |        1 |               4 |
|             1 |        2 |               1 |
|             1 |        3 |               3 |
|             1 |        4 |               2 |
|             2 |        2 |               1 |
|             2 |        3 |               2 |
+---------------+----------+-----------------+

Sen bir iç birleşim kullanarak saklanan sipariş verilen üye listesini seçebilirsiniz. Örneğin:

SELECT name
FROM members inner join orderings 
  ON members.member_id = orderings.member_id_value
WHERE orderings.member_id_key = <ID for member you want to lookup>
ORDER BY position;

Örneğin, John Smith'in listesi için bu sorguyu çalışan sonucu (yani, NEREYE member_id_key = 1) olacaktır:

+--------------+
| name         |
+--------------+
| Sue Someone  |
| John Smith   |
| John Johnson |
| John Doe     |
+--------------+

Belirli bir kimliği için maksimum pozisyon değerine bir ekleyerek listenin altına ekleyerek için konumunu hesaplayabilir.