שלח תשובה

זירת השאלות

532
צפיות
5
תשובות

איחוד טבלאות

,‏ 3 בינואר, 2005

שלום, אני רוצה לישלוף כמה נתונים מכמה טבלאות בשאילתה אחת, אז יצרתי את השאילתה הזאות:

SELECT date.date, id.id, name.name FROM date, id, name

אני מציג אותם כרגיל,בכל טבלה יש לי כ 4 רשומות, הבעייה מתחילה כשאר אני מציג את הנתונים, הוא חוזר על אותם נתונים כמה וכמה פעמים, לפי הנוסחה 4*4*4 (בסוף יוצא 64).
ניסיתי לעשות שעורי ביית וקראתי במדריך ה SQL על איחוד שאילתות, אבל לא הבנתי את החלק של ה LEFT/RIGHT/INNER.
למישהוא יש תשובה? אני בסך הכול מנסה לאחד בין הטבלאות שיציגו את הנתונים כראוי.
תודה.
נ.ב.
אני עובד אם php && mysql, אם זה משנה….

תגיות:

5 תשובות

  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

  2. אוריקס הגיב:

    אין לי כותרת בשביל לפקק את זה
    אתה מוזמן להמציא אחת ואז אני אפקק

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

    הסבר לשאילתות איחוד
    אני לא כריזמתי במיוחד בדברים כאלו

  4. אוריקס הגיב:

    קיבלת את זה
    אם אתה לא מרוצה זה ניתן לשינוי בכל עת.

שלח תשובה