שלח תשובה

זירת השאלות

1 תשובות

  1. ניר טייב הגיב:

    https://www.webmaster.org.il/showArticle.asp?id=178

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

    נגיד ואני רוצה לשלוף משלושה טבלאות:
    כותבי מאמרים, מאמרים וקטגוריות
    מהטבלה של כותבי המאמרים אני רוצה את השם משתמש של כותב המאמר
    מטבלת המאמרים אני רוצה את הנושא של המאמר
    ומטבלת הקטגוריות אני רוצה את שם הקטגוריה שבה המאמר נמצא.
    אז בעצם אנו שולפים 3 שדות אבל איזה מן קשר יש לנו ?
    בין טבלת המאמרים לטבלת הקטגוריות יש לנו קשר של יחיד לרבים(בקטגוריה אחת יש הרבה מאמרים)
    ובין טבלת המאמרים לטבלת הכתבים יש גם קשר יחיד לרבים( כותב אחד יכול לכתוב מאמרים רבים).

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

    SELECT ac.catName, ac.subject, w.writerName
    FROM
    (Articles a INNER JOIN Categories c ON a.catId=c.catId) ac
       INNER JOIN Writers w ON ac.writerId=w.writerId

    בעצם שלפנו כאן כל מאמר שיש לו כותב בטבלת הכתבים וששייך לקטגוריה בטבלת הקטגוריות.

    2. במידה והגדרנו בחלק של אכיפת קשרי גומלין שאפשרי שבטבלת המאמרים יהיו מאמרים שלא יהיה להם כתב רשום במערכת. אז בעצם נצטרך לשלב בין Inner Join ל-Left Join או Right Join (שהם בעצם מחזירים null עבור כל ערך בטבלה הנגדית לאופרטור Left/Right  שלא נמצא מתאים לטבלה של האופרטור)
    ואז בעצם השאילתא תיראה כך:

    SELECT ac.catName, ac.subject, w.writerName
    FROM
    (Articles a INNER JOIN Categories c ON a.catId=c.catId) ac
    LEFT JOIN Writers w ON ac.writerName=w.writerName

    או:

    SELECT ac.catName, ac.subject, w.writerName
    FROM
    Writers w RIGHT JOIN
    (Articles a INNER JOIN Categories c ON a.catId=c.catId) ac
    ON ac.writerName=w.writerName

    הסינטקס שהשתמשתי בו זה הסינטקס שאני מכיר מאקסס
    אני מניח שהוא דומה לזה של MySQL כי בכל זאת יש כאן את העניין של SQL ANSI
    בכל אופן תבדוק ב-dev.mysql.com

שלח תשובה