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

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

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

איך עושים JOIN?

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

    אני מקווה שהשאלה תהיה מובנת.
    יש לי טבלה infoעם עמודות של מספרי טלפון,שמות,קבוצות
    וטבלה שניהpoints עם עמודה של ניקוד , מספר טלפון,וקבוצה.

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

    בשביל לקבל את הרשימה בלי שמות עשיתי כך
    SELECT user ,points FROM points WHERE grup=123

    עכשיו אני מנסה לעשות JOIN ולא מצליח
    קודם כל השאילתא:
    SELECT user ,points FROM points JOIN info ON info.user=points.user ;
    מחזירה

    ERROR 1052 (23000): Column 'user' in field list is ambiguous
    

    ואם אני מוריד את user
    SELECTpoints FROM points WHERE grup=123
    אז הבקשת נתקעת ואני לא מקבל תגובה בכלל, עד שאני מקיש Ctrl-C
    ומקבל :

    Ctrl-C -- sending "KILL QUERY 87418" to server ...
    Ctrl-C -- query aborted.
    ERROR 1317 (70100): Query execution was interrupted
    

    אז כנראה פיספסתי משהו באיך עושים JOIN.

    מייל: nigun@duck.com

    yossizY תגובה 1 תגובה אחרונה
    0
    • nigunN nigun

      אני מקווה שהשאלה תהיה מובנת.
      יש לי טבלה infoעם עמודות של מספרי טלפון,שמות,קבוצות
      וטבלה שניהpoints עם עמודה של ניקוד , מספר טלפון,וקבוצה.

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

      בשביל לקבל את הרשימה בלי שמות עשיתי כך
      SELECT user ,points FROM points WHERE grup=123

      עכשיו אני מנסה לעשות JOIN ולא מצליח
      קודם כל השאילתא:
      SELECT user ,points FROM points JOIN info ON info.user=points.user ;
      מחזירה

      ERROR 1052 (23000): Column 'user' in field list is ambiguous
      

      ואם אני מוריד את user
      SELECTpoints FROM points WHERE grup=123
      אז הבקשת נתקעת ואני לא מקבל תגובה בכלל, עד שאני מקיש Ctrl-C
      ומקבל :

      Ctrl-C -- sending "KILL QUERY 87418" to server ...
      Ctrl-C -- query aborted.
      ERROR 1317 (70100): Query execution was interrupted
      

      אז כנראה פיספסתי משהו באיך עושים JOIN.

      yossizY מנותק
      yossizY מנותק
      yossiz
      כתב ב נערך לאחרונה על ידי 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
      • yossizY yossiz

        @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 מנותק
        nigunN מנותק
        nigun
        כתב ב נערך לאחרונה על ידי nigun
        #3

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

        מייל: nigun@duck.com

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

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

          OdedDvirO מנותק
          OdedDvirO מנותק
          OdedDvir
          כתב ב נערך לאחרונה על ידי
          #4

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

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

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

            nigunN מנותק
            nigunN מנותק
            nigun
            כתב ב נערך לאחרונה על ידי 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
            • nigunN nigun

              @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`))
              
              
              OdedDvirO מנותק
              OdedDvirO מנותק
              OdedDvir
              כתב ב נערך לאחרונה על ידי 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
              • OdedDvirO OdedDvir

                @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 מנותק
                nigunN מנותק
                nigun
                כתב ב נערך לאחרונה על ידי
                #7

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

                מייל: nigun@duck.com

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

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

                  OdedDvirO מנותק
                  OdedDvirO מנותק
                  OdedDvir
                  כתב ב נערך לאחרונה על ידי
                  #8

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

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

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

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

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

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

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

                    nigunN מנותק
                    nigunN מנותק
                    nigun
                    כתב ב נערך לאחרונה על ידי
                    #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
                    • OdedDvirO OdedDvir

                      @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 מנותק
                      nigunN מנותק
                      nigun
                      כתב ב נערך לאחרונה על ידי
                      #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
                        • nigunN nigun

                          @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 ;
                          
                          OdedDvirO מנותק
                          OdedDvirO מנותק
                          OdedDvir
                          כתב ב נערך לאחרונה על ידי 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
                          • OdedDvirO OdedDvir

                            @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 מנותק
                            nigunN מנותק
                            nigun
                            כתב ב נערך לאחרונה על ידי nigun
                            #13

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

                            מייל: nigun@duck.com

                            OdedDvirO nigunN 2 תגובות תגובה אחרונה
                            0
                            • nigunN nigun

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

                              OdedDvirO מנותק
                              OdedDvirO מנותק
                              OdedDvir
                              כתב ב נערך לאחרונה על ידי 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 nigun

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

                                nigunN מנותק
                                nigunN מנותק
                                nigun
                                כתב ב נערך לאחרונה על ידי
                                #15

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

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

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

                                מייל: nigun@duck.com

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

                                  @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 מנותק
                                  nigunN מנותק
                                  nigun
                                  כתב ב נערך לאחרונה על ידי
                                  #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
                                    • dovidD dovid

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

                                      nigunN מנותק
                                      nigunN מנותק
                                      nigun
                                      כתב ב נערך לאחרונה על ידי
                                      #18

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

                                      מייל: nigun@duck.com

                                      dovidD תגובה 1 תגובה אחרונה
                                      0
                                      • nigunN nigun

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

                                        dovidD מנותק
                                        dovidD מנותק
                                        dovid
                                        ניהול
                                        כתב ב נערך לאחרונה על ידי
                                        #19

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

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

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

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

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

                                          OdedDvirO מנותק
                                          OdedDvirO מנותק
                                          OdedDvir
                                          כתב ב נערך לאחרונה על ידי
                                          #20

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

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

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

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

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

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

                                          dovidD תגובה 1 תגובה אחרונה
                                          1
                                          תגובה
                                          • תגובה כנושא
                                          התחברו כדי לפרסם תגובה
                                          • מהישן לחדש
                                          • מהחדש לישן
                                          • הכי הרבה הצבעות


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

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

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