הביאו לך כבר 2 פתרונות *שיכולים לעבוד, להלן 2 פתרונות נוספים:
1. לשלוף את כל הרשומות מסודרות מהניקוד הגבוה לנמוך בפעם אחת ולרוץ על המערך שחזר באמצעות php עד שאתה מגיע לשורה הרצויה (אין צורך ליצור counter נוסף, האינדקס של האיבר + 1 = המיקום של המשתמש), ניתן לייעל את זה באמצעות פיצול המידע (לדוג' אתה יכול לפצל את הרשומות ל- 2 חלקים שווים, להשוות את הניקוד של המשתמש לניקוד של השורה האמצעית ואז לרוץ רק על חלק אחד בהתאם).
2. בדומה לפתרונות הקודמים שהוצעו רק הפעם ליישם את זה ב- MySQL עצמו באמצעות Stored functions\ Stored procedures (יש לבדוק צריכת משאבים ומשמעויות נוספות, לדעתי זה פחות יעיל).
3. לבצע הערכת מיקום פעם ב- X זמן, לשמור את המיקום של כל משתמש ולהשתמש בנתון הנ"ל בלבד (לא יספק הערכה בזמן אמת אבל מבחינת ביצועים יתן את התוצאה הטובה ביותר).
*הערות:
א. בפתרון שהציע BuildDream יש לקחת בחשבון ניהול כפילויות (מס' משתמשים בעלי ניקוד זהה).
ב. את הפתרון שהציע Haimz אני חושב שהפתרון שהצעתי מחליף בצורה טובה ויעילה יותר.
ממליץ לך להחיל אינדקסים מתאימים ולרוץ עם כל הפתרונות.
ניתן לחלק אותן ל- 2 קטגוריות עיקריות, תבדוק מה הכי יעיל עבורך -
1. שליפת כל הרשומות ומעבר עליהן באמצעות PHP (חסרון עיקרי: שליפה של המון מידע שלא בהכרח נחוץ).
2. העברת הלוגיקה למסד הנתונים ו/או שליפת רשומות עם ניקוד גבוה/נמוך יותר בלבד והערכת מיקום המשתמש בהתאם (חסרון עיקרי: עבודה מואמצת של מסד הנתונים).
כמו שאתה רואה ניתן לבצע את המשימה בכמה דרכים שונות, קח בחשבון שרובן לא יהיו יעילות עבור טבלאות גדולות.
לטבלה עם 100 רשומות ומס' קטן של הרצות זה כנראה לא יהיה קריטי - לטבלאות גדולות יותר ולאתרים עמוסים יותר פעולה כזו יכולה להעמיס על השרת בצורה משמעותית.
בהצלחה.
Last edited by אדיר; 29-12-12 at 11:59..
|