|
![]() |
# 1 |
משתמש - היכל התהילה
|
עזרה,שיטה לקבלת מיקום שורה
אהלן
חרשתי על כל האינטרנט ולא ממש מצאתי פיתרונות, יש לי טבלה של נגיד 100 אנשים לכל אחד יש ניקוד אני רוצה לבדוק איפה מישהו מסויים נמצא מתוך כל האנשים האלה לדוגמה יש א-1 ב-5 ג-4 ד-9 ה-0 אני רוצה לבדוק איפה ג נמצא ביחס לשאר,אני מסדר אותם לפי הניקוד ע"י ORDER BY DESC ואז אני צריך לבדוק באיזה מיקום הוא נמצא יש למישהו רעיון איך לבצע את זה? (בלי לולאה ארוכה שמחפשת את מי שאני צריך?) |
![]() |
![]() |
# 2 |
עסק רשום [?]
|
אתה יכול לשלוף COUNT של כמות השורות עם ניקוד יותר גבוהה.
כדי להוציא את המיקום של ג' תשלוף את כמות השורות עם ניקוד גדול יותר מ4, ותוסיף לזה 1 וקיבלת את המיקום של ג'.
__________________
BuildDream בניית אתרי אינטרנט לשירותך. עסק רשום במס הכנסה ומספק קבלות כחוק. www.BuildDream.co.il - www.iBuild.co.il |
![]() |
![]() |
# 3 |
חבר וותיק
|
אני לא חושב שהבנתי אותך, אבל אם כן אני בטוח שזה יעזור:
תשלוף על פי ORDER BY score ASC זאת אומרת על פי הניקוד הכי נמוך ועד הכי גבוה תצור משתנה קוד:
$count = 0; קוד:
$count++; ![]() אם אתה רוצה לדעת את המקום לכל אחד, תצטרך לשמור מערך שיכיל את הID ו המקום וכו'.. או במסד נתונים, איך שנוח לך. |
![]() |
![]() |
# 4 | |
עסק רשום [?]
|
ציטוט:
אם תוסיף לשאילתה שלך ערך נוסף שעולה כל פעם באחד (פשוט להוסיף משתנה לשאילתה) - חסכת לעצמך לולאה ושיפרת ביצועים.
__________________
BuildDream בניית אתרי אינטרנט לשירותך. עסק רשום במס הכנסה ומספק קבלות כחוק. www.BuildDream.co.il - www.iBuild.co.il |
|
![]() |
![]() |
# 5 | |
עסק רשום [?]
|
ציטוט:
מי מבטיח לך ש- MySQL עושה את זה בצורה מהירה ויעילה יותר מ- PHP? תפקיד מסד הנתונים הוא לאחסן מידע, ברוב המקרים רצוי להשאיר את תפקידו ככזה ולהימנע מביצוע לוגיקה בצד שלו. |
|
![]() |
![]() |
# 6 |
עסק רשום [?]
|
האמת שיש המון לוגיקה שעדיף להשאיר לצד של הDB, היום מערכות DB הן כבר לא רק לאחסון מידע ויש להן המון אפשרויות מתקדמות ויעילות. אני מסכים איתך שיש לוגיקה שעדיף לא להעביר לצד של הDB, אבל למשל שליפת המיקום שמדובר פה לדעתי עדיף להשאיר בDB ולא רק בגלל שזה יעיל יותר אלא גם בשביל הסדר בתוכנה שאתה כותב.
__________________
BuildDream בניית אתרי אינטרנט לשירותך. עסק רשום במס הכנסה ומספק קבלות כחוק. www.BuildDream.co.il - www.iBuild.co.il |
![]() |
![]() |
# 7 | |
עסק רשום [?]
|
ציטוט:
אני לא יכול להצביע על הפתרון הטוב ביותר במקרה הנ"ל (שכן תלוי איך אתה מגדיר "טוב ביותר"), אני ממליץ לבדוק את כל הפתרונות שהוצעו ולראות מה הכי משתלם והכי מתאים. |
|
![]() |
![]() |
# 8 |
חבר וותיק
|
זה פתרון שעלה לי בשלוף, אם תוכל להציג את המסד שלך ולפרט קצת יותר יהיה לי יותר מובן מה אתה צריך, כי כמו שאמרתי לא ממש הבנתי אותך..
|
![]() |
![]() |
# 9 |
עסק רשום [?]
|
הביאו לך כבר 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.. |
![]() |
![]() |
# 10 |
חבר מתקדם
|
|
![]() |
![]() |
חברים פעילים הצופים באשכול זה: 1 (0 חברים ו- 1 אורחים) | |
|
|