שלח תשובה

זירת השאלות

261
צפיות
54
תשובות

מדוע הJOIN לא מציג רשומות לפעמיים??

,‏ 27 באוגוסט, 2004

טוב תשמעו, עד שסוף סוף למדתי JOIN (והצלחתי בגדול..) הוא טיפ’לה עושה בעיות…
תראו, עשיתי שהJOIN יוציא לי מ-2 טבלאות את אותם מספרים (עמודת ID), כי ככה אני יודע בפורום למה כל הודעה ראשית שייכת התגובה שלה.
עכשיו הבעיה היא, שאם נגיד יש מספר מסויים (ב-ID) ואין אותו בטבלה השנייה אז הוא לא מצייג…אבל אם יש מספר (ב-ID) בטבלה הראשונה וגם בטבלה השנייה יש את אותו מספר, אז הוא מציג.

חשוב לומר שאני סידרתי את זה שהJOIN יציג לי הודעה ראשית, ואז את כל התגובות שלו (ע"פ הID בשני הטבלאות אני מזהה) אז בבקשה אם אתם מסדרים לי את הקוד, שלא התפקשש הסידור…

זה קוד הJOIN:

rp.open "SELECT foruma.subject AS subjectA, foruma.id, forumb.subject AS subjectB, foruma.id AS idA, forumb.id AS idB, foruma.name AS nameA, forumb.name AS nameB, foruma.message AS messageA, forumb.message AS messageB FROM foruma INNER JOIN forumb ON foruma.id = forumb.id order by forumb.id DESC"



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

שבת שלום,
והמשך גלישה נעימה

תגיות:

54 תשובות

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

    אז לא למדת אותו לסופו
    אתה רק התחלת את הנושא
    עליך להשתמש ב-OUTER JOIN מסוים (LEFT או RIGHT)
    קרא כאן:
    http://www.webmaster.org.il/showArticle.asp?id=178

  2. למה חשוב כ"כ לסגור אוביקטים??
    אמרו לי שזה מאוד חשוב לשרת…
    לא הבנתי בדיוק למה…

    מישבו יכול להסביר לי?

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

    הנה
    http://www.webmaster.org.il/forums/Message.asp?Id=15583
    זה קרה כאשר המסד הוא MSSQL אתה לא רוצה לתאר לעצמך מה היה קורה עם אקסס

  4. אויי ליייייייייייי !!!!
    אני עובד עם אקסס ויש לי לפחות 100 דפים שבהם לא איפסתי וסגרתי חיבורים!
    מזל שעדיין לא פתחתי את האתר…

    בכל אופן זה מה שאני אמור לעשות:

    set rs = nothing
    rs.close

    נכון? לא טעיתי..?

    תודה רבה.

  5. עוד פעם הJOIN הזה!!
    טוב אתם כבר יודעים שיש לי בעיה עם הJOIN…
    טוב אז ככה,
    לאחר שהסידור של הפורום עץ שלי עובד, אני רוצה שהוא יציג לי את ההודעות ע"פ נושאים.
    כלומר, אם אני נכנס לפורום משוב, אני רוצה לקבל רק את ההודעות של פורום משוב…
    ואם אני אכנס לפורום ASP אז שיציג לי הודעות של פורום ASP. וכך הלאה…

    במסד יש עמודה בשם FORUMA, בתוכה יש את העמודה GROOP שהיא מציגה לי מספרים (groop זה שדה טקסט), ע"פ המספרים האלה אני משייך נושאים.
    עכשיו אני שולח QUERYSTRIN בשם ID עם ערך מספרי כלשהו, המספר שיצא זה כאילו הפורום שאני מבקש.
    כלומר אם בID יצא לי ערך "21" , אז אני רוצה שהוא ימצא לי בGROOP את כל ההודעות עם הערך 21….

    בJOIN ניסתי לעשות את זה עם WHERE ועוד מלא דברים ושום דבר לא הצליח

    אז אולי אתם תצליחו לעזור לי??
    הינה קוד הJOIN:

    rp.open "SELECT foruma.groop, foruma.subject AS subjectA, foruma.id, forumb.subject AS subjectB, foruma.id AS idA, forumb.id AS idB, foruma.name AS nameA, forumb.name AS nameB, foruma.message AS messageA, forumb.message AS messageB FROM foruma Right JOIN forumb ON foruma.id = forumb.id order by foruma.DateToUpdate DESC"

    ישבתי ועמלתי על זה שעות ולא הצלחתי….
    אז בבקששה תעזרו לי..

    תודה מראש!

  6. תיקון קטן וחשוב!!!!!!
    GROOP הוא שדה מספרי ולא טקסט!!
    סליחה על הטעות.

  7. עוד שאלה–>עוד שאלה על JOIN
    תשמעו, בפורום שלי סידרתי את ההודעות הראשיות ע"פ סדר של תאריכים – זה בטבלת FORUMA.

    עכשיו מה עם הטבלה השניה? – FORUMB
    של התגובות.
    בקיצור הקוד מסדר לי את התגובות ע"פ הסדר שבא לו וזה נורא מעצבן!
    אני רוצה שהוא יסדר לי את זה ע"פ סדר ראשוני.

    איך אני עושה את זה?
    זה הקוד:

    rp.open "SELECT foruma.groop, foruma.subject AS subjectA, foruma.id, forumb.subject AS subjectB, foruma.id AS idA, forumb.id AS idB, foruma.name AS nameA, forumb.name AS nameB, foruma.message AS messageA, forumb.message AS messageB FROM foruma Right JOIN forumb ON foruma.id = forumb.id order by foruma.DateToUpdate DESC "

  8. אולי אם אני אסביר יותר קצר תבינו…
    כל שאני רוצה, זה שסדר (forumb.idx) התגובות יתחיל מלמטה למעלה אבל שישייך להודעה הראשית שלו.
    ניסתי לעשות ORDER BY אבל בגלל שזה מופיע פעם אחת אז אי אפשר..


    rp.open "SELECT foruma.groop, foruma.subject AS subjectA, foruma.id, forumb.subject AS subjectB, foruma.id AS idA, forumb.id AS idB, foruma.name AS nameA, forumb.name AS nameB, foruma.message AS messageA, forumb.message AS messageB FROM foruma Right JOIN forumb ON foruma.id = forumb.id order by foruma.DateToUpdate DESC "

  9. אמרו להיות לך שדה date
    כלשהו בטבלת התגובות.

    אז זה צריך להיות ככה:


    rp.open "SELECT foruma.groop, foruma.subject AS subjectA, foruma.id, forumb.subject AS subjectB, foruma.id AS idA, forumb.id AS idB, foruma.name AS nameA, forumb.name AS nameB, foruma.message AS messageA, forumb.message AS messageB FROM foruma Right JOIN forumb ON foruma.id = forumb.id order by foruma.DateToUpdate, forumb.DateToUpdate DESC"

  10. Full Outher Join מסרב לעבוד?!
    אני משתמש במסד מסוג אקסס ואני רוצה לשלוף את כל הרשומות ע"י Full outher join.
    הבעיה היחידה היא שזה לא עובד…טוב, שמעתי פעם שבאקסס זה לא יעבוד לי..אבל אני פשוט חייב לשלוף את כל הרשומות ללא יוצא מן הכלל…
    Right/Left outher join לא יעזרו לי בעיינין, כי אני חייב לשלוף את הכל!

    איך אני פותר את הבעיה ובמה ני אמור להשתמש ע"מ לשלוף את כל הרשומות?

    תודה מראש.

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

    אם אתה צריך את כל הרשומות
    אתה יכול להשתמש ב-UNION או בCROSS JOIN (ע"י שימוש ב-Old style – ז"א לא מפורש)

  12. UNION ו-CROSS לא יעזרו לי מכיון….
    שאני צריך לשלוף רשומות זהות ע"פ הID שבין 2 הטבלאות.

  13. אני רוצה להסביר לך קצת יותר…
    אני לפורום עץ שלי השתמשתי ב-Right outher join.
    הקוד פחות או יותר בסדר, הבעיה היחידה שלו היא, שתמיד אבל תמיד הוא מציג לי תגובה אחת פחות.
    לדוגמה:
    בנושא ראשי מסויים, אמורת להיות 6 תגובות, במקום שהוא יציג לי 6 תגובות לנושא, הוא מציג לי רק 5 (בדר"כ את התגובה האחרונה הוא לא כותב).
    ברגע שאני מוסיף לנושא זה עוד תגובה (עכשיו אמרות להיות 7 תגבות) הוא שוב מציג לי רשומה אחת פחות, 6 תגובות במקום 7.

    אני כבר מיואש ולא יודע מה לעשות
    הקוד של הJOIN:

    rp.open "SELECT forumb.DateToUpdate, forumb.idx, foruma.groop, foruma.subject AS subjectA, foruma.id, forumb.subject AS subjectB, foruma.id AS idA, forumb.id AS idB, foruma.name AS nameA, forumb.name AS nameB, foruma.message AS messageA, forumb.message AS messageB FROM foruma Right JOIN forumb ON foruma.id = forumb.id WHERE groop = "& IdOfTheForum &" order by foruma.DateToUpdate DESC, forumb.idx DESC "

  14. ואם תשלוף את כל הנתונים?
    הוא בכל זאת יציג לך אחת פחות.. לא רק שזה   מ א ו ד   לא יעיל, זה גם לא בהכרח יפתור את הבעיה. תבדוק אם הלולאה שלך בסדר.

  15. לא מצאתי משהו שיכול לגרום לבעיה…
    כל מה שעשיתי, זה פתחתי מסד נתונים (החלק של הJOIN) ואז יש כמה משתנים שאני מאפס, ואז יש לולאת Do until שרצה על כל הרשומות ואז בפנים מופיע כל החלק של הצגת הנתונים, ואז סוגרים את הלולאה.

    נ.ב.
    אני לא מצליח להכניס אפילו חצי מהקוד כי זה קוד נורא ארוך (עולה על 3000 תווים).

    אז טל, אם יש כל דבר קטן שיכול לעזור לך (ולי כמובן) לפתור את הבעיה הזו, אני אתן בשמחה.

    תודה מראש,
    ומצפה לתגובה.

  16. ובמידה ותשלוף את כל הנתונים הבעיה
    תפתר? כי אם אתה אומר שהוא מציג תגובה אחת פחות, זה אומר שהוא שולף את הנתונים כמו שצריך. הסיבה היחידה שנראית לי הגיונית זה בעיה עם הלולאה.
    תפתח את המסד שלך ותסתכל אם התגובה האחרונה מקבלת את ה- ID המתאים. תנסה לחפש בעיה ב- DB עצמו.

    אם אתה מעביר למערך, אולי הערך ההתחלתי שלך הוא 0, ולכן אתה מריץ את הלולאה פעם אחת פחות.

  17. אתה יודע מה, תראה את זה…


    <%
    ThisIsNot = ""
    Goofi = 0
    collsp = "  "
    HowMuchCollsp = 0
    %>

    <% Do until Rp.EOF %>

    <div align=right>
    <%
    Goofi = Goofi +1
    %>
          
    <tr><td width="660" align="Right" Valign="top" DIR="rtl" style="font-size:9pt; color:#000000; font-family:Arial; font-weight:bold;">

                                  
    <%
    If ThisIsNot <> Rp("idA") then ‘ מבטל חזרה על נושא שנראה כבר
    HowMuchMS = Rp("idA") ‘ מספר ההודעה
    HaveYouMessage = "yes" ‘ בודק האם נכתבו בכלל הודעות
    %>
    <a href="ForumIdS.asp" style="text-decoration: none;"><span style="color:#618ECF; font-size:24;">•</span></a>
    <a class=link_bold2 Href=’javascript:ShowHide(<%= Goofi %>)’>
     <%= Rp("subjectA") %>
    <% ThisIsNot = Rp("idA") %>
    <% WAZ = "yes" %>
    <% collsp = "" %>
    </a>
    <% Else %>
    <% if HowMuchCollsp < 9 then %>
    <% collsp = ""& collsp &"   " %>
    <% Else %>
    <% collsp = "  " %>
    <% End if %>
    <%=collsp%>
    <a href="ForumIdS.asp">
    <% if Rp("messageB") <> "" then %>
    <span style="color:#EA9106; font-size:20;" style="text-decoration: none;">•</span></a>
    <% Else %>
    <span style="color:#AAA7C1; font-size:20;" style="text-decoration: none;">•</span></a>
    <% End if %>
    <a class=link_bold2 Href=’javascript:ShowHide(<%= Goofi %>)’>
     <%= Rp("subjectB") %>
    <% WAZ = "not" %>
    </a>
    <% End if %>

    בקוד הזה אני לא מחזיר את הנושא הראשי יותר מפעם אחת.
    אני מבדיל בין נושאים ראשים לתגובות (צבעי הנקודה בהתאם).

    אין פה את תוכן ההודעה כי זה כבר לא נכנס…
    אז אם צריך עוד מהקוד אין לי בעיה להוסיף

    בתודה מראש,
    ומצפה לתגובה.

  18. הערה קטנה על הקוד הזה..
    כל פעם שאתם רואים שרשום collsp ואז בגרשיים יש רווח תדעו שאמור להפיע שם המילה & n b s p ; (בלי רווחים).

    כששלחתי את ההודע הזה פשוט החליף לרווח.

  19. אולי
    תיצור דף שתרשום בו את כל הקוד, ותעלה את הקובץ לפורום? יהיה יותר קל.
    ועוד משהו, למה אתה כל שורה עושה את זה <%ו- %>? זה לא יעיל יותר, וזה בהחלט מעצבן קצת

  20. איזה הודעת שגיאה אתה מקבל?
    ועוד משהו, זה די מיותר לפתוח שני connection-ים לאותו מסד. אתה לא צריך לפתוח אותו בפעם השנייה, משום שעל connection אחד אפשר להריץ מספר recordset-ים.

  21. אני לא מקבל הודעת שגיאה….
    סה"כ הוא לא מציג לי את הרשומה האחרונה (שכחת?)

    בקשר ל-Connectionים, זה רק לביינתים…
    זה לא יישאר ככה עוד הרבה זמן…

    נ.ב.
    מה לעשות עכשיו? אין הודעת שגיאה אלא הוא מציג נתונים (חוץ מתגובה אחרונה).

  22. תוסיף את זה
    לפני שאתה סוגר את ה- recordset.

    if err>0 then
      response.write "Description: " & err.description
    else
      response.write "There is not any  error"
    end if

  23. והפלט התקבל הוא:


    There is not any error

    יענו אין שום שגיאה בקוד (לצערי!) !

  24. יש עוד רעיונות?
    ואולי הבעיה היא בכלל בJOIN ?

  25. יש לי שאלה אליך….
    רשמת את התנאי הזה:

    if HowMuchCollsp < 9 then

    השאלה שלי היא: מהו הערך ההתחלתי של HowMuchCollsp, ואיפה בדיוק אתה מגדיל את הערך שלו? כי חיפשתי את המקום שאתה מגדיל את הערך שלו ולא מצאתי. בנוסף, אתה גם צריך לאפס אותו, כפי שעשית את המשתנה Goofi.

  26. בעצם איפסת, אבל אתה חייב להגדיל את
    הערך שלו כל פעם, כדי שהוא יגיע ל- 9 מתישהו.

  27. בעצם…. זה לא קשור..
    השעה עושה את שלה כנראה…. ואני אלך לישון!

  28. כנראה..חחח..בכל אופן תיקנתי…
    לא שזה עזר…אבל עדייף כך.
    העלתי את הקובץ המתוקן…

  29. אוקי עדכנתי כמה דברים חשובים בקוד
    אנא פעלו ובדקו את הקוד בלבד

  30. כדי להמחיש את מה שאמרתי, צפו בזה…
    בתמונה הראשונה, בפורום הרקורסיבי שלי (אני עובד שם ללא JOIN) רואים שם את כל התגובות לנושא (כפי שנראה יש שם 2 תגובות).
    התמונה הראשונה
    לאומת זאת, בפורום עץ שלי, רואים את אותו הנושא (הראשון למעלה!!) אבל עם תגובה אחת במקום 2 !!
    התמונה השניה

    לא מובן לי למה זה קורה?
    טל, אולי תוכל להגיד לי מה יכולה להיות הסיבה לכך?

    תודה מראש,
    ומצפה לתגובה.

  31. מצאתי את הבעיה!!תעזרו לי לפתור אותה
    טוב קודם כל אני לא מאמין שזו הבעיה שלי…
    נכון בקוד שלי רשמתי בעמצא בערך את משפט הIF הזה?!


    If ThisIsNot <> Rp("idA") then ‘ מבטל חזרה על נושא שנראה כבר

    בקיצור משם מגיעה הבעיה!!!!!!!!!
    אני לא יודע למה ואיך זה קרה אבל אם אני מוריד את המשפט הזה (וגם את הELSE שלו ואת הEND IF ) אז הוא מציג לי את כל התגובות לנושא מבלי להוריד נושא אחד פחות!!!!!
    אבל אז קורה משהו אחר (כרגיל…) אחרי כל תגובה אני שוב מקבל את הנושא הראשי.

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

    טוב, עכשיו אני בטוח שיהיה לכם יותר קל לעזור לי לפתור את הבעיה…
    אז מי ראשון?

    תודה רבה.

  32. Alon12 הגיב:

    אוקיי
    אני מגיב כאן כדי שזה לא יגלוש…
    קודם כל אתה בטוח שהרקורדסט שלך נקרא Rp?
    אחר כך תבדוק שיש עמודה בשם idA
    ואם יש משתנה בשם ThisIsNot
    אחר כך תבדוק ששמת Else וEnd if במקומות הנכונים

  33. תקרא את המאמר שלי ניר
    על בניית פורום רקורסיבי או כל מאמר שמסביר כיצד בונים פורום רקורסיבי ותבדוק איך עושים שהוא יזהה האם זאת הודעה ראשית או לא.

  34. אבל מישהו יכול להסביר לי למה דווקא
    מהרשומה הזו מגיעה הבעיה???
    לא מצאתי שום דבר שיכול לגרום לדבר כזה…

  35. תיקון קריטי במילים
    במקום רשומה התכוונתי למשתנה ThisIsNot

  36. דרך אגב..אפשר כבר לפתוח נושא חדש?
    השירשור כבר מפוצץ!

    מנהלים?

שלח תשובה

חדש! אחסון אתרים של וובמאסטר

שירות אחסון אתרים
המקצועי של וובמאסטר!

מומחים באירוח אתרי
WordPress, Joomla, Drupal

  • שרתי לינוקס עם CloudLinux, LiteSpeed
  • 1GB דיסק SSD, 10GB תעבורה חודשית
  • ממשק ניהול cPanel, תעודת SSL חינם

עכשיו במחיר היכרות:
רק 420 ש"ח לשנה!