דילוג לתוכן
  • דף הבית
  • קטגוריות
  • פוסטים אחרונים
  • משתמשים
  • חיפוש
  • חוקי הפורום
כיווץ
תחומים

תחומים - פורום חרדי מקצועי

💡 רוצה לזכור קריאת שמע בזמן? לחץ כאן!
  1. דף הבית
  2. תכנות
  3. SQL | שאילתת JOIN עם מופע אחרון בטבלה שניה

SQL | שאילתת JOIN עם מופע אחרון בטבלה שניה

מתוזמן נעוץ נעול הועבר תכנות
11 פוסטים 4 כותבים 193 צפיות
  • מהישן לחדש
  • מהחדש לישן
  • הכי הרבה הצבעות
התחברו כדי לפרסם תגובה
נושא זה נמחק. רק משתמשים עם הרשאות מתאימות יוכלו לצפות בו.
  • WWWW מנותק
    WWWW מנותק
    WWW
    כתב ב נערך לאחרונה על ידי WWW
    #1

    יש לי 2 טבלאות:

    1. לקוחות: מזהה | טלפון | פרטים_נוספים
    2. לוג: ID | מזהה_לקוח | תאריך

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

    WWW.netfree@gmail.com || קשבק! החזר כספי לבנק על רכישות באינטרנט || עונים על סקרים ומרוויחים כסף!

    WWWW תגובה 1 תגובה אחרונה
    0
    • WWWW מנותק
      WWWW מנותק
      WWW
      השיב לWWW ב נערך לאחרונה על ידי
      #2

      @www עשיתי לפי זה:
      https://stackoverflow.com/questions/3619030/mysql-join-the-most-recent-row-only/3619209#3619209
      בינתיים נראה שזה עובד טוב, השאלה אם יש משהו יותר יעיל.

      WWW.netfree@gmail.com || קשבק! החזר כספי לבנק על רכישות באינטרנט || עונים על סקרים ומרוויחים כסף!

      clickoneC תגובה 1 תגובה אחרונה
      0
      • clickoneC מנותק
        clickoneC מנותק
        clickone
        השיב לWWW ב נערך לאחרונה על ידי clickone
        #3

        @www לדעתי תלוי כמה רשומות אתה מחזיר.
        ז"א, אם אתה מחזיר רשומה אחת, (נניח אתה רוצה לקבל את הלוג האחרון רק ללקוח ספציפי) אז אין הבדל בכל שיטה שתבחר.
        אם זה מחזיר הרבה תוצאות, הייתי משתמש בLEFT JOIN רגיל, ועושה GROUP BY על התוצאה, ומבקש MAX על השדה של תאריך הלוג.
        אני חושב שזה יותר זריז ויעיל.

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

        אין טסט כמו פרודקשן.

        המייל שלי urivpn@gmail.com

        WWWW dovidD 2 תגובות תגובה אחרונה
        4
        • WWWW מנותק
          WWWW מנותק
          WWW
          השיב לclickone ב נערך לאחרונה על ידי WWW
          #4

          @clickone אמר בSQL | שאילתת JOIN עם מופע אחרון בטבלה שניה:

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

          אני מחזיר רשומות בודדות בסוף. 1 - 10

          אם זה מחזיר הרבה תוצאות, הייתי משתמש בLEFT JOIN רגיל, ועושה GROUP BY על התוצאה, ומבקש MAX על השדה של תאריך הלוג.
          אני חושב שזה יותר זריז ויעיל.

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

          הלוג מכיל כרגע 576072 רשומות, בקטנה...

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

          אין עיכוב בינתיים.

          WWW.netfree@gmail.com || קשבק! החזר כספי לבנק על רכישות באינטרנט || עונים על סקרים ומרוויחים כסף!

          תגובה 1 תגובה אחרונה
          2
          • dovidD מחובר
            dovidD מחובר
            dovid ניהול
            השיב לclickone ב נערך לאחרונה על ידי
            #5

            @clickone אמר בSQL | שאילתת JOIN עם מופע אחרון בטבלה שניה:

            אם זה מחזיר הרבה תוצאות, הייתי משתמש בLEFT JOIN רגיל, ועושה GROUP BY על התוצאה, ומבקש MAX על השדה של תאריך הלוג.

            זה אכן מה שצריך לעשות, ומה שבstackoverflow הציעו אחרת זה בגלל ששמה התבקשו להגיע לעוד נתונים של השורה הזו מה שלא יתאפשר ע"י MAX.

            מנטור אישי למתכנתים (ולא רק) – להתקדם לשלב הבא!

            בכל נושא אפשר ליצור קשר dovid@tchumim.com

            WWWW תגובה 1 תגובה אחרונה
            2
            • WWWW מנותק
              WWWW מנותק
              WWW
              השיב לdovid ב נערך לאחרונה על ידי
              #6

              @dovid אמר בSQL | שאילתת JOIN עם מופע אחרון בטבלה שניה:

              זה אכן מה שצריך לעשות, ומה שבstackoverflow הציעו אחרת זה בגלל ששמה התבקשו להגיע לעוד נתונים של השורה הזו מה שלא יתאפשר ע"י MAX.

              אתה מתכוון עוד נתונים מהטבלה הראשונה או השנייה?
              לא הצלחתי להבין למה זה יותר חסכוני, למה לא עדיף לסנן את השורות לפני הJOIN ולחסוך אלפי שורות מיותרות מהטבלה הראשונה?

              WWW.netfree@gmail.com || קשבק! החזר כספי לבנק על רכישות באינטרנט || עונים על סקרים ומרוויחים כסף!

              dovidD תגובה 1 תגובה אחרונה
              0
              • dovidD מחובר
                dovidD מחובר
                dovid ניהול
                השיב לWWW ב נערך לאחרונה על ידי dovid
                #7

                @www באופן כללי בSQL אתה תמיד אומר מה שאתה רוצה, ומאמין שהוא עושה את זה טוב. (הפקפוקים צריכים לבוא רק כשהמקרה שלך לא קלאסי או כשבדיעבד המציאות "חורקת").
                אתה יכול להיות רגוע, אתה יכול לבדוק ולראות שהדרך שאמרנו מהירה יותר מסינון מוקדם.
                הסינון המקודם כופה על השרת דרך שנראית לך טובה יותר, ועלולה שלא לתת לו לבחור דרכים טובות מזו. לפעמים חייבים לכפות דרך או בגלל שיודעים מראש שהדרך בה השרת יבחר היא שגויה, או כי זה ההתנסחות היחידה שמביאה את התוצאה הרצויה כמו מה שקרה שם בSO.

                @www אמר בSQL | שאילתת JOIN עם מופע אחרון בטבלה שניה:

                אתה מתכוון עוד נתונים מהטבלה הראשונה או השנייה?

                מהשניה. הם רצו לאתר בטבלה השניה את השורה שבשדה X היא המקסימום, ומאותה שורה לקחת עוד כמה שדות. במקרה כזה נדרש לעשות קוד מסורבל יותר מאשר במקרה שלך. המקרה שלך זו שאילתת קיבוץ קלאסית, וכמות השורות בה לא רלוונטי.

                מנטור אישי למתכנתים (ולא רק) – להתקדם לשלב הבא!

                בכל נושא אפשר ליצור קשר dovid@tchumim.com

                dovidD תגובה 1 תגובה אחרונה
                5
                • dovidD מחובר
                  dovidD מחובר
                  dovid ניהול
                  השיב לdovid ב נערך לאחרונה על ידי
                  #8

                  הכי טוב זה לבדוק בעצמך את ההבדל, הייתי כותב לך את שני השאילתות אבל אין לי את השמות וגם לא ציינת אם מדובר בMYSQL או MSSQL (משנה טיפה בסינטקס).
                  אני מצרף קישורים כדי שתנוח דעתך:
                  https://stackoverflow.com/questions/14164784/mysql-using-group-by-vs-subselect-in-columns-list
                  https://stackoverflow.com/questions/3156090/which-is-faster-join-with-group-by-or-a-subquery

                  מנטור אישי למתכנתים (ולא רק) – להתקדם לשלב הבא!

                  בכל נושא אפשר ליצור קשר dovid@tchumim.com

                  WWWW 2 תגובות תגובה אחרונה
                  2
                  • WWWW מנותק
                    WWWW מנותק
                    WWW
                    השיב לdovid ב נערך לאחרונה על ידי
                    #9

                    @dovid תודה רבה!
                    מדובר ב MYSQL, ואני מאמין לך אל תדאג, רק חיפשתי הסבר, ושכחתי מהתורה הזאת שSQL זו שפת תוצאות...
                    עכשיו אני מבין, אבדוק את זה.

                    WWW.netfree@gmail.com || קשבק! החזר כספי לבנק על רכישות באינטרנט || עונים על סקרים ומרוויחים כסף!

                    א תגובה 1 תגובה אחרונה
                    3
                    • WWWW מנותק
                      WWWW מנותק
                      WWW
                      השיב לdovid ב נערך לאחרונה על ידי
                      #10

                      @dovid אתה צודק ובגדול!
                      זה לוקח חצי מהזמן! זה מורגש.

                      WWW.netfree@gmail.com || קשבק! החזר כספי לבנק על רכישות באינטרנט || עונים על סקרים ומרוויחים כסף!

                      תגובה 1 תגובה אחרונה
                      2
                      • א מנותק
                        א מנותק
                        ארכיטקט
                        השיב לWWW ב נערך לאחרונה על ידי
                        #11

                        @www אמר בSQL | שאילתת JOIN עם מופע אחרון בטבלה שניה:

                        שפת תוצאות

                        הנכון: שפה הצהרתית (דקלרטיבית)
                        רוצה לומר: אתה מצהיר שאלו התוצאות שאתה רוצה והוא צריך "לשבור את הראש" איך להביא לך אותם.

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

                        אידיאולוגיות גדולות נכנסות למטחנה של עולם המעשה ויוצאות ממנו בפירורים (ווינסטון צ'רצ'יל, סתם סתם, זה שלי)

                        תגובה 1 תגובה אחרונה
                        2

                        בא תתחבר לדף היומי!
                        • התחברות

                        • אין לך חשבון עדיין? הרשמה

                        • התחברו או הירשמו כדי לחפש.
                        • פוסט ראשון
                          פוסט אחרון
                        0
                        • דף הבית
                        • קטגוריות
                        • פוסטים אחרונים
                        • משתמשים
                        • חיפוש
                        • חוקי הפורום