532
צפיות
צפיות
5
תשובות
תשובות
איחוד טבלאות
שלום, אני רוצה לישלוף כמה נתונים מכמה טבלאות בשאילתה אחת, אז יצרתי את השאילתה הזאות:
SELECT date.date, id.id, name.name FROM date, id, name
אני מציג אותם כרגיל,בכל טבלה יש לי כ 4 רשומות, הבעייה מתחילה כשאר אני מציג את הנתונים, הוא חוזר על אותם נתונים כמה וכמה פעמים, לפי הנוסחה 4*4*4 (בסוף יוצא 64).
ניסיתי לעשות שעורי ביית וקראתי במדריך ה SQL על איחוד שאילתות, אבל לא הבנתי את החלק של ה LEFT/RIGHT/INNER.
למישהוא יש תשובה? אני בסך הכול מנסה לאחד בין הטבלאות שיציגו את הנתונים כראוי.
תודה.
נ.ב.
אני עובד אם php && mysql, אם זה משנה….
5 תשובות
אפשר לקרוא גם במאמרים 😉
בכל אופן מה שקורה לך זה בעצם איחוד שאילתות ללא קשר מסויים.
אני מניח שאתה מבין את העניין של קשרי גומלין (ואם לא אז כנס למאמרים במדור 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
אין לי כותרת בשביל לפקק את זה
אתה מוזמן להמציא אחת ואז אני אפקק
הסבר לשאילתות איחוד

אני לא כריזמתי במיוחד בדברים כאלו
"שאילתות איחוד – מי? למה? וכמה?"
קיבלת את זה
אם אתה לא מרוצה זה ניתן לשינוי בכל עת.