הרשם שאלות ותשובות רשימת חברים לוח שנה הודעות מהיום

חזור   הוסטס - פורום אחסון האתרים הגדול בישראל > עיצוב גראפי, תכנות על כל שפותיו וקידום ושיווק אתרים > פורום תיכנות

   
|!|

השב
 
כלים לאשכול תצורת הצגה
ישן 29-12-12, 08:04   # 1
Ori The Man
משתמש - היכל התהילה
 
מיני פרופיל
תאריך הצטרפות: Oct 2005
מיקום: חיפה
גיל: 34
הודעות: 3,694
שלח הודעה באמצעות MSN אל Ori The Man Send a message via Skype™ to Ori The Man

Ori The Man לא מחובר  

עזרה,שיטה לקבלת מיקום שורה

אהלן
חרשתי על כל האינטרנט ולא ממש מצאתי פיתרונות,

יש לי טבלה של נגיד 100 אנשים
לכל אחד יש ניקוד
אני רוצה לבדוק איפה מישהו מסויים נמצא מתוך כל האנשים האלה
לדוגמה יש

א-1
ב-5
ג-4
ד-9
ה-0

אני רוצה לבדוק איפה ג נמצא ביחס לשאר,אני מסדר אותם לפי הניקוד ע"י ORDER BY DESC
ואז אני צריך לבדוק באיזה מיקום הוא נמצא

יש למישהו רעיון איך לבצע את זה? (בלי לולאה ארוכה שמחפשת את מי שאני צריך?)
  Reply With Quote
ישן 29-12-12, 09:07   # 2
BuildDream
עסק רשום [?]
 
BuildDream's Avatar
 
מיני פרופיל
תאריך הצטרפות: Oct 2010
הודעות: 527
Send a message via Skype™ to BuildDream

BuildDream לא מחובר  

אתה יכול לשלוף COUNT של כמות השורות עם ניקוד יותר גבוהה.

כדי להוציא את המיקום של ג' תשלוף את כמות השורות עם ניקוד גדול יותר מ4, ותוסיף לזה 1 וקיבלת את המיקום של ג'.
__________________
BuildDream בניית אתרי אינטרנט לשירותך.
עסק רשום במס הכנסה ומספק קבלות כחוק.
www.BuildDream.co.il - www.iBuild.co.il
  Reply With Quote
ישן 29-12-12, 10:35   # 3
Haimz
חבר וותיק
 
מיני פרופיל
תאריך הצטרפות: Sep 2010
הודעות: 1,221

Haimz לא מחובר  

אני לא חושב שהבנתי אותך, אבל אם כן אני בטוח שזה יעזור:
תשלוף על פי ORDER BY score ASC זאת אומרת על פי הניקוד הכי נמוך ועד הכי גבוה
תצור משתנה
קוד:
$count = 0;
ובתוך הלולאה תעשה
קוד:
$count++;
ואז תבדוק אם הגעת למשתנה שאתה רוצה אז תעצור את הלולאה (break). יפעל

אם אתה רוצה לדעת את המקום לכל אחד, תצטרך לשמור מערך שיכיל את הID ו המקום וכו'.. או במסד נתונים, איך שנוח לך.
  Reply With Quote
ישן 29-12-12, 12:02   # 4
BuildDream
עסק רשום [?]
 
BuildDream's Avatar
 
מיני פרופיל
תאריך הצטרפות: Oct 2010
הודעות: 527
Send a message via Skype™ to BuildDream

BuildDream לא מחובר  

ציטוט:
נכתב במקור על ידי Haimz צפה בהודעה
אני לא חושב שהבנתי אותך, אבל אם כן אני בטוח שזה יעזור:
תשלוף על פי ORDER BY score ASC זאת אומרת על פי הניקוד הכי נמוך ועד הכי גבוה
תצור משתנה
קוד:
$count = 0;
ובתוך הלולאה תעשה
קוד:
$count++;
ואז תבדוק אם הגעת למשתנה שאתה רוצה אז תעצור את הלולאה (break). יפעל

אם אתה רוצה לדעת את המקום לכל אחד, תצטרך לשמור מערך שיכיל את הID ו המקום וכו'.. או במסד נתונים, איך שנוח לך.
אין סיבה לעשות לולאה נוספת אם במילא הMySQL עובר על כל השורות

אם תוסיף לשאילתה שלך ערך נוסף שעולה כל פעם באחד (פשוט להוסיף משתנה לשאילתה) - חסכת לעצמך לולאה ושיפרת ביצועים.
__________________
BuildDream בניית אתרי אינטרנט לשירותך.
עסק רשום במס הכנסה ומספק קבלות כחוק.
www.BuildDream.co.il - www.iBuild.co.il
  Reply With Quote
ישן 29-12-12, 12:12   # 5
אדיר
עסק רשום [?]
 
מיני פרופיל
תאריך הצטרפות: Mar 2008
מיקום: אשקלון
הודעות: 1,714

אדיר לא מחובר  

ציטוט:
נכתב במקור על ידי BuildDream צפה בהודעה
אין סיבה לעשות לולאה נוספת אם במילא הMySQL עובר על כל השורות

אם תוסיף לשאילתה שלך ערך נוסף שעולה כל פעם באחד (פשוט להוסיף משתנה לשאילתה) - חסכת לעצמך לולאה ושיפרת ביצועים.
ב- 2 הפתרונות כנראה שיש צורך לעבור על כל השורות (למעט שילוב אופטימיזציות כמו זו שהצעתי)-
מי מבטיח לך ש- MySQL עושה את זה בצורה מהירה ויעילה יותר מ- PHP?

תפקיד מסד הנתונים הוא לאחסן מידע, ברוב המקרים רצוי להשאיר את תפקידו ככזה ולהימנע מביצוע לוגיקה בצד שלו.
  Reply With Quote
ישן 29-12-12, 12:45   # 6
BuildDream
עסק רשום [?]
 
BuildDream's Avatar
 
מיני פרופיל
תאריך הצטרפות: Oct 2010
הודעות: 527
Send a message via Skype™ to BuildDream

BuildDream לא מחובר  

ציטוט:
נכתב במקור על ידי xPerfection צפה בהודעה
ב- 2 הפתרונות כנראה שיש צורך לעבור על כל השורות (למעט שילוב אופטימיזציות כמו זו שהצעתי)-
מי מבטיח לך ש- MySQL עושה את זה בצורה מהירה ויעילה יותר מ- PHP?

תפקיד מסד הנתונים הוא לאחסן מידע, ברוב המקרים רצוי להשאיר את תפקידו ככזה ולהימנע מביצוע לוגיקה בצד שלו.
האמת שיש המון לוגיקה שעדיף להשאיר לצד של הDB, היום מערכות DB הן כבר לא רק לאחסון מידע ויש להן המון אפשרויות מתקדמות ויעילות. אני מסכים איתך שיש לוגיקה שעדיף לא להעביר לצד של הDB, אבל למשל שליפת המיקום שמדובר פה לדעתי עדיף להשאיר בDB ולא רק בגלל שזה יעיל יותר אלא גם בשביל הסדר בתוכנה שאתה כותב.
__________________
BuildDream בניית אתרי אינטרנט לשירותך.
עסק רשום במס הכנסה ומספק קבלות כחוק.
www.BuildDream.co.il - www.iBuild.co.il
  Reply With Quote
ישן 29-12-12, 12:53   # 7
אדיר
עסק רשום [?]
 
מיני פרופיל
תאריך הצטרפות: Mar 2008
מיקום: אשקלון
הודעות: 1,714

אדיר לא מחובר  

ציטוט:
נכתב במקור על ידי BuildDream צפה בהודעה
האמת שיש המון לוגיקה שעדיף להשאיר לצד של הDB, היום מערכות DB הן כבר לא רק לאחסון מידע ויש להן המון אפשרויות מתקדמות ויעילות. אני מסכים איתך שיש לוגיקה שעדיף לא להעביר לצד של הDB, אבל למשל שליפת המיקום שמדובר פה לדעתי עדיף להשאיר בDB ולא רק בגלל שזה יעיל יותר אלא גם בשביל הסדר בתוכנה שאתה כותב.
מסכים איתך חלקית - עם זאת יש הבדל בין מה שמסד הנתונים יכול לעשות לבין מה שכדאי שהוא יעשה.

אני לא יכול להצביע על הפתרון הטוב ביותר במקרה הנ"ל (שכן תלוי איך אתה מגדיר "טוב ביותר"), אני ממליץ לבדוק את כל הפתרונות שהוצעו ולראות מה הכי משתלם והכי מתאים.
  Reply With Quote
ישן 29-12-12, 12:24   # 8
Haimz
חבר וותיק
 
מיני פרופיל
תאריך הצטרפות: Sep 2010
הודעות: 1,221

Haimz לא מחובר  

ציטוט:
נכתב במקור על ידי BuildDream צפה בהודעה
אין סיבה לעשות לולאה נוספת אם במילא הMySQL עובר על כל השורות

אם תוסיף לשאילתה שלך ערך נוסף שעולה כל פעם באחד (פשוט להוסיף משתנה לשאילתה) - חסכת לעצמך לולאה ושיפרת ביצועים.
זה פתרון שעלה לי בשלוף, אם תוכל להציג את המסד שלך ולפרט קצת יותר יהיה לי יותר מובן מה אתה צריך, כי כמו שאמרתי לא ממש הבנתי אותך..
  Reply With Quote
ישן 29-12-12, 11:40   # 9
אדיר
עסק רשום [?]
 
מיני פרופיל
תאריך הצטרפות: Mar 2008
מיקום: אשקלון
הודעות: 1,714

אדיר לא מחובר  

הביאו לך כבר 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..
  Reply With Quote
ישן 03-01-13, 01:47   # 10
MAORBARI
חבר מתקדם
 
מיני פרופיל
תאריך הצטרפות: Sep 2008
הודעות: 484

MAORBARI לא מחובר  

אתם לא רציניים..
http://msdn.microsoft.com/en-us/library/ms186734.aspx
הכי טוב והכי יעיל !
  Reply With Quote
השב

חברים פעילים הצופים באשכול זה: 1 (0 חברים ו- 1 אורחים)
 


חוקי פירסום
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is מופעל
סמיילים הם מופעל
[IMG] קוד מופעל
קוד HTML מכובה

קפיצה לפורום


כל הזמנים הם GMT +2. הזמן כעת הוא 09:27.

מופעל באמצעות VBulletin גרסה 3.8.6
כל הזכויות שמורות ©
כל הזכויות שמורות לסולל יבוא ורשתות (1997) בע"מ