سؤال

ولدي جدول السجلات في الخلية. ولست بحاجة للحفاظ على النظام بالنسبة لهم كما هو محدد من قبل المستخدم. حتى لقد أضاف عمود موقف '.

وماذا سيكون بيان SQL لتحديث كافة السجلات عندما أنتقل سجل معين؟ لقد حصلت على شيء من هذا القبيل:

UPDATE items SET position = '2' WHERE id ='4';
UPDATE items SET position = position+1 WHERE position >= '2' AND id != '4';

ولكن أكبر من سيكون أقل مما لو سجل انتقلت إلى أسفل. ما هي خدعة؟ شكرا!

هل كانت مفيدة؟

المحلول

والقيام بهذا الشيء لمثل أوامر البيع مع أرقام الأسطر التي يحتفظ بها المستخدم، لقد وجدت أنه من الأفضل التعامل معها في صفيف في BL أو واجهة المستخدم. وعادة ما سوف ترغب في ضبط العديد من السجلات، وأحيانا أريد أن أقول "ننسى ذلك". لذلك قد يكون أسهل لمجرد الانتظار حتى تضغط على زر "موافق" (أو ما يعادلها الخاص بك) ثم كتابتها كل مرة مع الطلب الحالي.

وأنت قد ينتهي التعامل مع الحذف، أيضا، والذي هو مشكلة أخرى تستطيع التعامل معها بنفس الطريقة.

نصائح أخرى

وليت شيئا من هذا القبيل نفعل ذلك؟

UPDATE items 
SET position = CASE position 
  WHEN $oldpos THEN $newpos 
  ELSE position + SIGN($oldpos-$newpos)
 END
WHERE position BETWEEN LEAST( $newpos, $oldpos ) 
                AND GREATEST( $newpos, $oldpos );

واختبرته بضع مرات، ويبدو للعمل.

وهذا هو بلدي يأخذ على هذا: مقالي ROW_INDEX وعدد مع خطوة من 10 (على سبيل المثال: 0، 10، 20، رعاية الطفولة المبكرة). عندما يقوم بتحديث مستخدم واحد من الصف تحتاج إلى معرفة ما إذا كان سيكون أعلى أو لأسفل. إذا كان لديك لنقل صف 2ND إلى 4 (الذهاب إلى أسفل، ROW_INDEX المطلوب = 30)، يمكنك تعيين ROW_INDEX إلى 35؛ خلاف ذلك (إذا كان الذهاب لأعلى) تعيينها إلى 25. تعيين هذه القيمة:

UPDATE your_table SET row_index = 35 WHERE your_id = 1234

والآن لديك بالترتيب الصحيح، ولكن افسدت row_indexes تصل. لحل هذه المشكلة، تنفيذ هذا اثنين من الاستفسارات:

SET @pos:=-10;
UPDATE your_table SET row_index = @pos:=@pos+10 WHERE ...

وهذا هو الذهاب الى تحديث كل ما تبذلونه من الصفوف (أو واحدة تختار مع بيان مكان) وتعيين عمود ROW_INDEX دون ثغرات (0، 10، 20، 30، رعاية الطفولة المبكرة). بالتأكيد بهذه الطريقة يضيف الحمل على عمليات الكتابة، ولكن أعتقد أنه من أسرع طريقة للحصول على النظام أثناء عمليات القراءة. إذا قمت بحذف الصف الذي يمكن أن مجرد إعادة تشغيل الاستعلامات أجل تحديد.

وأود أن أقترح، كحد أدنى، وذلك باستخدام بزيادات كبيرة (ويقول 10000) بين العناصر. ثم مجرد القيام على أمر من. إذا كنت بحاجة إلى نقل 11000 الى ما بين 9000 و 10000 فقط ثم تعيينه إلى 9500، وفعلت.

وهذا لا يلغي مشكلة إعادة ترتيب ولكنه يقلل ذلك كثيرا. في مرحلة ما كنت أفضل حالا حذف كافة الصفوف ثم readding لهم الترتيب الصحيح. القيام التحديثات مثل تفعلونه هو مجرد خطأ جدا إيمهو عرضة.

وكنت قد تنظر باستخدام مرتبطة نوع قائمة النهج، مع مفتاح إلى أخرى، وربما العنصر السابق في القائمة، ثم لديك فقط لتحديث بعض السجلات، بدلا من كل منهم.

ومثيرة للاهتمام! حسنا، لذلك ليس هناك إجابة سهلة. ظننت أنني مجرد شيء مفقود. كنت قد فكرت في الحفاظ على مجموعة خارجية. الذي يبدو وكأنه أفضل فكرة.

وربما شيء من هذا القبيل؟

$item_id = $_GET['item_id']; 
$position = $_GET['new_position']; 
$old_position = $_GET['old_position'];

if($new_position < $old_position) {
    SQL: UPDATE items SET position = position+1 WHERE position >= $new_position AND position < $old_position  
} else {  
SQL: UPDATE items SET position = position-1 WHERE position <= $new_position AND position > $old_position
}  

SQL: UPDATE items SET position = $new_position WHERE item_id = $item_id 
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top