לוגו אתר Fresh          
 
 
  אפשרות תפריט  ראשי     אפשרות תפריט  צ'אט     אפשרות תפריט  מבזקים     אפשרות תפריט  צור קשר     חץ שמאלה ‎print ‎"Hello World!"; if‎ ‎not rules.‎know ‎then rules.‎read(); חץ ימינה  

לך אחורה   לובי הפורומים > מחשבים > תכנות ובניית אתרים
שמור לעצמך קישור לדף זה באתרי שמירת קישורים חברתיים
תגובה
 
כלי אשכול חפש באשכול זה



  #7  
ישן 21-08-2008, 01:10
  משתמש זכר dorM dorM אינו מחובר  
מנהל
 
חבר מתאריך: 26.07.08
הודעות: 6,473
בתגובה להודעה מספר 6 שנכתבה על ידי ישראל K שמתחילה ב "1. לגבי השימוש ב-LIMIT. כשזה..."

אני די בטוח שאני מבין מדוע ומתי צריך להשתמש ב-JOIN.
אסביר בקצרה: משתמשים ב-JOIN כאשר רוצים לבחור מידע מטבלה נוספת, כאשר ניתן לקשר בין הטבלה הראשית (שבפיסקת ה-FROM) לטבלה שבוחרים בפיסקת ה-JOIN.

אם בטבלה tbl1 אני צריך אך ורק רשומה אחת, ובטבלה tbl2 אני צריך 2 רשומות ומעלה (טכנית יכול להיות שאקח ממנה רשומה אחת, אבל בהחלט יכול להיות מצב של יותר מ-1), אז כאשר אשתמש ב-JOIN זה יהיה לי קצת מוזר במקרה הזה.
אני לא בטוח מהי התוצאה הסופית במצב כזה, אבל יכול להיות שהמידע של tbl1 לא יתקבל מהרשומה השנייה ומעלה, או שהמידע של tbl1 כן יתקבל גם מהרשומה השנייה ומעלה (שזה סתם מיותר). בכל מקרה, שני המצבים לא מתאימים למקרה הנוכחי.
תגובה ללא ציטוט תגובה עם ציטוט חזרה לפורום
  #11  
ישן 21-08-2008, 13:56
  משתמש זכר dorM dorM אינו מחובר  
מנהל
 
חבר מתאריך: 26.07.08
הודעות: 6,473
בתגובה להודעה מספר 10 שנכתבה על ידי ישראל K שמתחילה ב "במקרים רבים, טבלה קרטזית תהיה..."

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


עשיתי בדיקה benchmark ואכן צדקת - עם INNER JOIN זה מהיר יותר במאית שניה (ב-0.001 מהיר יותר).

אבל כאן מגיעה אלי בעיה חדשה:
אני צריך לשלב איכשהו ב-WHERE, שבמידה ולא מצאתי בטבלה tbl1 את ה-id שדרוש לי, אז זה יבחר רשומה ע"פ קריטריונים אחרים (ע"פ 2 שדות אחרים).

בדרך שעשיתי (לא בדרך של INNER JOIN), כתבתי את זה בצורה הבאה:

קוד:
WHERE (tbl1.id=123 OR ( col_foo=456 AND col_bar=789 ) ) AND active_row=1

המספרים הנ"ל שבחרתי הם שרירותיים.

אם אכתוב את פיסקת ה-WHERE שלמעלה כאשר אני משתמש ב-INNER JOIN, זה יסבך לי את התוצאה שאקבל מהשאילתא, כפי שגם צפוי לקרות.

אני משתמש ב-col_foo ו-col_bar כדי למצוא רשומה אחרת, במידה ולא מצאתי את הרשומה ע"פ ה-id שנתון לי (שבמקרה הזה הוא 123).

את ה-active_row אני חייב שיהיה שווה ל-1 בכל מקרה שבו אני מקבל מידע\רשומה מהטבלה tbl1, כדי שאקבל רשומה שהיא נחשבת פעילה. לכן אני צריך אותו בשני המצבים הנ"ל.

לכן השאלה היא האם זה משתלם להשתמש ב-INNER JOIN, בגלל הבעיות החדשות שמופיעות, שכנראה בגללם אצטרך להריץ שאילתא חדשה וניפרדת כדי לקבל רשומה מהטבלה tbl1 ?

יש לציין שיש עוד מצב אחד אחרון - שבו אני בוחר רנדומלית (בעזרת ORDER BY RAND) רשומה מהטבלה tbl1 שהיא פעילה ( שיש לה active_row=1 ), במידה ולא קיבלתי רשומה בתנאי של col_foo ו-col_bar.
המצב הזה סיבך אותי עוד קצת יותר ולכן נכון לעכשיו הוא מורץ בשאילתא נפרדת (במידה והשאילתא הראשונה לא החזירה שום רשומה).

נערך לאחרונה ע"י dorM בתאריך 21-08-2008 בשעה 13:59.
תגובה ללא ציטוט תגובה עם ציטוט חזרה לפורום
  #13  
ישן 21-08-2008, 13:03
  משתמש זכר dorM dorM אינו מחובר  
מנהל
 
חבר מתאריך: 26.07.08
הודעות: 6,473
בתגובה להודעה מספר 12 שנכתבה על ידי borsood שמתחילה ב "1. מנהג גרוע. אתה יכול לגרום..."

ציטוט:
1. מנהג גרוע. אתה יכול לגרום לאופטימיזר לבחור בתוכנית פעולה פחות טובה ראיתי את זה קורה


אפשר בבקשה דוגמא?
לא ראיתי בשום מקום (גם לא בדוקומנטציה של MySQL) שלא כדאי להשתמש ב-LIMIT מלבד העמוד הבא: http://dev.mysql.com/doc/refman/5.1...ures-limit.html שבמקרה הזה אמנע משימוש ב-LIMIT כשאתקל בו.

יש את העמוד הבא:
http://dev.mysql.com/doc/refman/5.0...timization.html
שמסביר מתי השימוש ב-LIMIT עוזר.

ציטוט:
2. מהנתונים שסיפקת נראה ש join הוא בדיוק מה שאתה צריך. למה שלא תנסה את השאילות שלך ממנשק SQL טהור רק כדי לראות את מה שאתה מקבל?
כאשר משתמשים בJOIN זה לא רק במקרים שבהם אתה רוצה רק שורה אחת יש גם שימושים הרבה יותר מורכבים.

אני יודע מה תהיה התוצאה בכל מקרה של JOIN...
תראה גם את התגובה שכתבתי לישראל - http://www.fresh.co.il/vBulletin/sh...365#post3023725

תודה על העזרה

נערך לאחרונה ע"י dorM בתאריך 21-08-2008 בשעה 13:06.
תגובה ללא ציטוט תגובה עם ציטוט חזרה לפורום
תגובה

כלי אשכול חפש באשכול זה
חפש באשכול זה:

חיפוש מתקדם
מצבי תצוגה דרג אשכול זה
דרג אשכול זה:

מזער את תיבת המידע אפשרויות משלוח הודעות
אתה לא יכול לפתוח אשכולות חדשים
אתה לא יכול להגיב לאשכולות
אתה לא יכול לצרף קבצים
אתה לא יכול לערוך את ההודעות שלך

קוד vB פעיל
קוד [IMG] פעיל
קוד HTML כבוי
מעבר לפורום



כל הזמנים המוצגים בדף זה הם לפי איזור זמן GMT +2. השעה כעת היא 19:15

הדף נוצר ב 0.06 שניות עם 10 שאילתות

הפורום מבוסס על vBulletin, גירסא 3.0.6
כל הזכויות לתוכנת הפורומים שמורות © 2024 - 2000 לחברת Jelsoft Enterprises.
כל הזכויות שמורות ל Fresh.co.il ©

צור קשר | תקנון האתר