שאילתת sql מורכבת

רוקי1

New member
שאילתת sql מורכבת

אני מתכנת ב-PHP ובמסד mysql. יש לי טבלה ששומרת טבלת אלופים של כמה משחקים (לפי id של כל משחק) שיש באתר שלי (משחקי רשת שפועלים בדפדפן). הכל שם עובד מצויין, אבל רציתי לדעת אם ישנה דרך פשוטה עם שאילתת sql אחת בכדי לשלוף את כל בעלי התוצאות הכי גבוהות (כלומר המקום ראשון) לכל המשחקים (את ה-id של המשחק, את ה-id של המשתמש ואת הניקוד), האם יש אפשרות כזאת, או שאהיה חייב לבצע שאילתה לכל משחק? אם יש אפשרות לעשות זאת בשאילתה אחת, כיצד? תודה.
 

רון84

New member
פתרון

SELECT T0.GameID, T0.User, T0.Score FROM ScoreTable T0, (SELECT GameID, MAX(Score) AS Champ FROM ScoreTable GROUP BY GameID) T1 Where T0.GameID=T1.GameID AND T0.Score=T1.Champ ORDER BY T0.GameID​
 

רוקי1

New member
לא ממש עובד

תודה, אבל זה לא עובד. ככל הנראה MySQL לא תומך ב-Sub Select. האם יש אפשרות אחרת?
 

shanor

New member
מממ....JOIN....

כמובן ש-MYSQL לא תומך ב- SUB SELECT, זה כתוב (עדיין) בכל מדריך של MYSQL.... אבל בדרך כלל כל מה שעושים ב- SUB SELECT הוא ליצור מצב שבו יש שאילתה שעל סמך התוצאות שלה, מבוצעת שאילתה שניה כאשר התוצאות של השאילתה השניה מוגבלות לאותם תאים/שורות שכבר התקבלו על ידי השאילתה השניה (או במילים אחרות: אם ניקח מצב של אני רוצה לקנות מכונית אצל סוחר מכוניות, אבל אני רוצה אותה בצבע ירוק מזעזע, ומסוג של סוסיתא, אז אני צריך ליצור שאילתה שתעשה משהו כזה: א. תשאל איפה יש מקומות (חנויות) של מכוניות (משומשות) ו-ב. למי מבין אלו יש סוסיתא בצבע ירוק מזעזע. הגבלתי את התוצאה של השאילתה על ידי שאילתה אחרת), עכשיו, אחרי ההסבר הלא הכי מוצלח שבעולם הזה, עבור על ה- MANUAL של MYSQL, תחפש את הפקודה של JOIN, תגלה שיש לה כמה פונקציות (תלוי מה בא אחריה), אבל בדרך כלל משתמשים ב- JOIN LEFT או JOIN (תלוי מה צריך). הפעולה כאן היא דיי זהה כאשר תוצאה של שאילתה אחת (השאילתה הראשית) מוגבלת על ידי החיבור על פי התנאי שמוצב בין שתי השאילתות (זה טיפה מסובך להבנה בהתחלה, אבל אחרי שתופסים את העיניין זה דיי פשוט והגיוני). בוא רגע נחזור לדוגמה הקודמת עם המכונית, התנאים לא השתנו, אני עדיין רוצה סוסיתא בצבע ירוק מזעזע, אבל הצורה שבה אני אשאל את זה תהיה טיפה שונה: תבחר את כל סוחרי המכוניות ותחבר אותם שמאלה (JOIN LEFT במקרה הזה) עם כל המכוניות הסוסיתא בצבע ירוק מזעזע. פתרון אחר אם כי קצת יותר עקום אבל לגיטימי וטוב בהחלט הוא ליצור טבלאות זמניות (תחפס את זה במדריך של MYSQL תחת TEMPORARY TABLES), משמע ליצור שאילתה אחת, את התוצאות להכניס לתוך טבלה זמנית (כן יש פונקציה כזו והיא עובדת מצויין - אין בעיה של התנגשויות בין טבלאות זמניות של משתמשים שונים) ולבצע את השאילתה השניה על הטבלה הזמנית. אחרי שסיימת למחוק את הטבלאות הזמניות וזהו. הפתרון הזה טוב כאשר יש טבלאות מאוד גדולות ומורכבות, אבל בגלל שהוא דורש כתיבה של טבלאות חדשות הוא יכול להיות איטי בצורה מורגשת ביחס למשפט SELECT...JOIN מורכב עד כמה שיהיה. זהו בהצלחה שנאור.
 

רוקי1

New member
תודה

טבלה זמנית נראת לי רעיון נוראי, חבל על השרת ועל הזמן. אולי מקל על התיכנות, אבל ממש לא נשמע טוב. אני אנסה את join. תודה.
 
למעלה