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

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

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

איך עושים JOIN?

מתוזמן נעוץ נעול הועבר תכנות
56 פוסטים 4 כותבים 757 צפיות
  • מהישן לחדש
  • מהחדש לישן
  • הכי הרבה הצבעות
התחברו כדי לפרסם תגובה
נושא זה נמחק. רק משתמשים עם הרשאות מתאימות יוכלו לצפות בו.
  • yossizY מנותק
    yossizY מנותק
    yossiz
    השיב לnigun ב נערך לאחרונה על ידי yossiz
    #2

    @nigun אמר באיך עושים JOIN?:

    קודם כל השאילתא:
    SELECT user ,points FROM points JOIN info ON info.user=points.user ;
    מחזירה
    ERROR 1052 (23000): Column 'user' in field list is ambiguous

    צריך לכתוב points.user או info.user אחרת הוא לא יודע מאיפה לקחת את העמודה user (למרות שעם קצת מחשבה הוא היה יכול להגיע למסקנה שלפי תנאי ה-JOIN יש לשניהם אותו ערך, אבל כנראה הוא לא מוכן להשקיע קצת מחשבה...)

    📧 יוסי@מייל.קום | 🌎 בלוג | ☕ קפה

    nigunN תגובה 1 תגובה אחרונה
    4
    • nigunN מנותק
      nigunN מנותק
      nigun
      השיב לyossiz ב נערך לאחרונה על ידי nigun
      #3

      @yossiz
      הוא שוב נתקע
      יכול להיות בגלל שזו טבלה גדולה?
      עריכה: בטבלת points יש 371574 שורות
      בטבלת info יש 29542 שורות.

      מייל: nigun@duck.com

      OdedDvirO תגובה 1 תגובה אחרונה
      0
      • OdedDvirO מנותק
        OdedDvirO מנותק
        OdedDvir
        השיב לnigun ב נערך לאחרונה על ידי
        #4

        @nigun מה סוג הנתונים של user?

        nigunN תגובה 1 תגובה אחרונה
        0
        • nigunN מנותק
          nigunN מנותק
          nigun
          השיב לOdedDvir ב נערך לאחרונה על ידי dovid
          #5

          @OdedDvir

          
          CREATE TABLE  `userinfo` (
              `id` INT(10) NOT NULL AUTO_INCREMENT,
              `grup` INT(11) NULL DEFAULT NULL,
              `user` VARCHAR(14) NULL DEFAULT NULL,
              `nameText`  TEXT NULL DEFAULT NULL,
              `note` TEXT NULL DEFAULT NULL,
              PRIMARY KEY (`id`)
          
          CREATE TABLE  `points` (
              `id` INT(10) NOT NULL AUTO_INCREMENT,
              `grup` INT(11) NULL DEFAULT NULL,
              `user` VARCHAR(20) NULL DEFAULT NULL,
              `questionId` INT(11) NULL DEFAULT NULL,
              `points` INT(11) NULL DEFAULT NULL,
              `time` INT(64) NULL DEFAULT NULL,
              `answerId` INT(11) NULL DEFAULT NULL,
              PRIMARY KEY (`id`))
          
          

          מייל: nigun@duck.com

          OdedDvirO תגובה 1 תגובה אחרונה
          0
          • OdedDvirO מנותק
            OdedDvirO מנותק
            OdedDvir
            השיב לnigun ב נערך לאחרונה על ידי OdedDvir
            #6

            @nigun ייתכן שסוג הנתונים של מחרוזת בשילוב עם מספר הרשומות הגדול יוצר מעמסה.
            ראשית, הייתי מנסה לבצע את הJoin על קבוצה קטנה, למשל ה-1000 הראשונים מכל טבלה ולראות אם נתקע:

            SELECT P.user, P.points FROM (SELECT TOP 1000 * FROM points) AS P JOIN (SELECT TOP 1000 * FROM userinfo) AS I ON P.user=I.user ;
            

            בטבלת points יש 371574 שורות
            בטבלת info יש 29542 שורות.

            לפי הנתונים, מספר הרשומות האפשריות בJoin הוא 371K * 29K = 10,759,000,000!
            לפי סדר הריצה כנראה הDB מבצע JOIN ואח"כ מסנן.
            אם אתה צריך רק קבוצה מסויימת, תסנן את שתי הטבלאות לפני הJOIN

            עריכה: בהתבוננות שניה, עדיין לא הבנתי מדוע אתה מבצע JOIN אך לא מציג כלום מטבלת userinfo

            nigunN 2 תגובות תגובה אחרונה
            1
            • nigunN מנותק
              nigunN מנותק
              nigun
              השיב לOdedDvir ב נערך לאחרונה על ידי
              #7

              @OdedDvir
              א. בMYSQL לא עובד TOP
              אז השתמשתי בLIMIT.
              וזה אכן עבד.
              ב. הורדתי את הלימיט והשאילתא עבדה
              מה ההבדל בין השאילתות?

              מייל: nigun@duck.com

              OdedDvirO תגובה 1 תגובה אחרונה
              0
              • OdedDvirO מנותק
                OdedDvirO מנותק
                OdedDvir
                השיב לnigun ב נערך לאחרונה על ידי
                #8

                @nigun אמר באיך עושים JOIN?:

                מה ההבדל בין השאילתות?

                לא הבנתי למה כוונתך

                nigunN תגובה 1 תגובה אחרונה
                0
                • nigunN מנותק
                  nigunN מנותק
                  nigun
                  השיב לOdedDvir ב נערך לאחרונה על ידי
                  #9

                  @OdedDvir
                  מה ההבדל בין

                  SELECpoints.user ,points.points FROM points JOIN info ON info.user=points.user
                  

                  לבין

                  SELECT P.user, P.points FROM (SELECT TOP 1000 * FROM points) AS P JOIN (SELECT TOP 1000 * FROM userinfo) AS I ON P.user=I.user ;
                  

                  מייל: nigun@duck.com

                  OdedDvirO תגובה 1 תגובה אחרונה
                  0
                  • nigunN מנותק
                    nigunN מנותק
                    nigun
                    השיב לOdedDvir ב נערך לאחרונה על ידי
                    #10

                    @OdedDvir אמר באיך עושים JOIN?:

                    עריכה: בהתבוננות שניה, עדיין לא הבנתי מדוע אתה מבצע JOIN אך לא מציג כלום מטבלת userinfo

                    שניה, פעם ראשונה שאני עושה JOIN
                    אני עדיין מנסה להבין איך זה עובד?

                    מייל: nigun@duck.com

                    תגובה 1 תגובה אחרונה
                    0
                    • nigunN מנותק
                      nigunN מנותק
                      nigun
                      כתב ב נערך לאחרונה על ידי
                      #11

                      יופי עכשיו השאילתא:

                       SELECT P.user, P.points,I.nameText FROM (SELECT * FROM points ) AS P JOIN (SELECT * FROM userinfo ) AS I ON P.user=I.user and P.grup=123;
                      

                      מחזירה לי תוצאות תוך 6.58 שניות

                      מייל: nigun@duck.com

                      תגובה 1 תגובה אחרונה
                      0
                      • OdedDvirO מנותק
                        OdedDvirO מנותק
                        OdedDvir
                        השיב לnigun ב נערך לאחרונה על ידי OdedDvir
                        #12

                        @nigun אמר באיך עושים JOIN?:

                        מה ההבדל בין ...

                        לכאורה אין הבדל:

                        SELECT points.user, points.points FROM points JOIN info ON info.user=points.user 
                        

                        לבין (אם נוריד את ה TOP\LIMIT)

                        SELECT points.user, points.points FROM points JOIN userinfo ON points.user=userinfo.user;
                        

                        אינני יודע, אך אולי ב MYSQL הסדר של ה ON משנה וצריך לרשום:

                        ON points.user=info.user 
                        

                        ולא

                        ON info.user=points.user
                        
                        nigunN תגובה 1 תגובה אחרונה
                        0
                        • nigunN מנותק
                          nigunN מנותק
                          nigun
                          השיב לOdedDvir ב נערך לאחרונה על ידי nigun
                          #13

                          @OdedDvir
                          בשניהם זה נתקע.
                          אולי אני ישאיר את זה לחצי שעה
                          ונראה מתי זה מצליח להביא את התוצאות בסוף.

                          מייל: nigun@duck.com

                          OdedDvirO nigunN 2 תגובות תגובה אחרונה
                          0
                          • OdedDvirO מנותק
                            OdedDvirO מנותק
                            OdedDvir
                            השיב לnigun ב נערך לאחרונה על ידי OdedDvir
                            #14

                            @nigun אמר באיך עושים JOIN?:

                            אולי אני ישאיר את זה לחצי שעה

                            אני עדיין מציע לך לבצע סינון WHERE לפי הקבוצה לפני הJOIN, ולהרוויח את הזמן הזה:

                            SELECT P.user, P.points,I.nameText
                            FROM (SELECT * FROM points WHERE points.grup=123) AS P
                            JOIN (SELECT * FROM userinfo WHERE userinfo.grup=123) AS I
                            ON P.user=I.user; 
                            
                            nigunN תגובה 1 תגובה אחרונה
                            2
                            • nigunN מנותק
                              nigunN מנותק
                              nigun
                              השיב לnigun ב נערך לאחרונה על ידי
                              #15

                              @nigun אמר באיך עושים JOIN?:

                              @OdedDvir
                              בשניהם זה נתקע.
                              אולי אני ישאיר את זה לחצי שעה
                              ונראה מתי זה מצליח להביא את התוצאות בסוף.

                              בדקתי עכשיו
                              ואני רואה שהבקשה ארכה 31 דקות!!!!
                              מעניין מה ההבדל?

                              מייל: nigun@duck.com

                              OdedDvirO תגובה 1 תגובה אחרונה
                              0
                              • nigunN מנותק
                                nigunN מנותק
                                nigun
                                השיב לOdedDvir ב נערך לאחרונה על ידי
                                #16

                                @OdedDvir אמר באיך עושים JOIN?:

                                @nigun אמר באיך עושים JOIN?:

                                אולי אני ישאיר את זה לחצי שעה

                                אני עדיין מציע לך לבצע סינון WHERE לפי הקבוצה לפני הJOIN, ולהרוויח את הזמן הזה:

                                SELECT P.user, P.points,I.nameText
                                FROM (SELECT * FROM points WHERE points.grup=123) AS P
                                JOIN (SELECT * FROM userinfo WHERE userinfo.grup=123) AS I
                                ON P.user=I.user; 
                                

                                יפה
                                עכשיו זה ירד ל0.23 שניות.

                                מייל: nigun@duck.com

                                תגובה 1 תגובה אחרונה
                                1
                                • dovidD מנותק
                                  dovidD מנותק
                                  dovid ניהול
                                  כתב ב נערך לאחרונה על ידי
                                  #17

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

                                  • מנטור אישי בתכנות והמסתעף – להתקדם לשלב הבא!
                                  • בכל נושא אפשר ליצור קשר dovid@tchumim.com
                                  nigunN תגובה 1 תגובה אחרונה
                                  1
                                  • nigunN מנותק
                                    nigunN מנותק
                                    nigun
                                    השיב לdovid ב נערך לאחרונה על ידי
                                    #18

                                    @dovid
                                    אז מה השתבש אצלי?

                                    מייל: nigun@duck.com

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

                                      @nigun זה מה שאני שואל את עצמי לאורך כל האשכול.

                                      • מנטור אישי בתכנות והמסתעף – להתקדם לשלב הבא!
                                      • בכל נושא אפשר ליצור קשר dovid@tchumim.com
                                      תגובה 1 תגובה אחרונה
                                      1
                                      • OdedDvirO מנותק
                                        OdedDvirO מנותק
                                        OdedDvir
                                        השיב לnigun ב נערך לאחרונה על ידי
                                        #20

                                        @nigun אמר באיך עושים JOIN?:

                                        מעניין מה ההבדל?

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

                                        @dovid אמר באיך עושים JOIN?:

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

                                        אולי עדיף לא להשאיר את הדבר בידיים של הDB איפה שאפשר בקלות לקבוע את הסדר כדלעיל?

                                        dovidD תגובה 1 תגובה אחרונה
                                        1
                                        • nigunN מנותק
                                          nigunN מנותק
                                          nigun
                                          כתב ב נערך לאחרונה על ידי
                                          #21

                                          בהמשך לשאלה הנ"ל
                                          לפעמים יש משתמשים שלא רשומים ב userinfo
                                          אבל אני בכל זאת אני רוצה לקבל את הרשומה שלהם בpoints
                                          איך אני כותב את השאילתא?

                                          מייל: nigun@duck.com

                                          OdedDvirO תגובה 1 תגובה אחרונה
                                          0

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

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

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