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

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

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

Having OR Where

מתוזמן נעוץ נעול הועבר תכנות
9 פוסטים 3 כותבים 384 צפיות 2 עוקבים
  • מהישן לחדש
  • מהחדש לישן
  • הכי הרבה הצבעות
תגובה
  • תגובה כנושא
התחברו כדי לפרסם תגובה
נושא זה נמחק. רק משתמשים עם הרשאות מתאימות יוכלו לצפות בו.
  • ש
    ש
    ש.ב.ח.
    כתב ב נערך לאחרונה על ידי ש.ב.ח.
    #1

    שלום וברכה

    יש לי שאילתה שמביאה הרבה צבירות מכל מיני מקומות (ובגלל הגנריות של המערכת אין לי אפשרות אפ' לדעת כמה היא תכיל) וגם חישובים של הצבירות (כלומר צבירה {אופרטור} צבירה)
    הנקודה היא: שאני גם אמור לבצע חיפוש בכל העמודות (בין עמודות הצבירה ובין עמודות רגילות)
    וכאן מגיעה השאלה:
    יש לי אפשרות להשתמש בwhere כך זה בערך נראה:

    WHERE `collection_id` = 6
      and (
        (
          (
            SELECT sum(`meta_records`.`VALUE`)
            FROM `meta_records`
              INNER JOIN `records` AS `laravel_reserved_0` ON `laravel_reserved_0`.`id` = `meta_records`.`record_id`
              INNER JOIN `meta_records` AS `data0` ON `data0`.`record_id` = `laravel_reserved_0`.`id`
            WHERE `records`.`id` = `data0`.`VALUE`
              and `meta_records`.`field_id` = 27
          ) -(
            SELECT sum(`meta_records`.`VALUE`)
            FROM `meta_records`
              INNER JOIN `records` AS `laravel_reserved_1` ON `laravel_reserved_1`.`id` = `meta_records`.`record_id`
              INNER JOIN `meta_records` AS `data1` ON `data1`.`record_id` = `laravel_reserved_1`.`id`
              INNER JOIN `meta_records` AS `data0` ON `data0`.`record_id` = `data1`.`VALUE`
            WHERE `records`.`id` = `data0`.`VALUE`
              and `meta_records`.`field_id` = 23
          )
        ) like '%29617192161911%'
        or (
          (
            (
              SELECT `data_data_0`.`VALUE`
              FROM `meta_records` AS `data_data_0`
                INNER JOIN `records` AS `records_data2` ON `records_data2`.`id` = `data_data_0`.`record_id`
                INNER JOIN `meta_records` AS `data0` ON `data0`.`VALUE` = `records_data2`.`id`
              WHERE `data0`.`record_id` = `records`.`id`
                and `data_data_0`.`field_id` = 10
            ) *(
              SELECT sum(`meta_records`.`VALUE`)
              FROM `meta_records`
                INNER JOIN `records` AS `laravel_reserved_2` ON `laravel_reserved_2`.`id` = `meta_records`.`record_id`
                INNER JOIN `meta_records` AS `data0` ON `data0`.`record_id` = `laravel_reserved_2`.`id`
              WHERE `records`.`id` = `data0`.`VALUE`
                and `meta_records`.`field_id` = 15
            )
          ) + (
            SELECT `data_data_0`.`VALUE`
            FROM `meta_records` AS `data_data_0`
              INNER JOIN `records` AS `records_data2` ON `records_data2`.`id` = `data_data_0`.`record_id`
              INNER JOIN `meta_records` AS `data2` ON `data2`.`VALUE` = `records_data2`.`id`
              INNER JOIN `meta_records` AS `data1` ON `data1`.`VALUE` = `data2`.`record_id`
              INNER JOIN `meta_records` AS `data0` ON `data0`.`VALUE` = `data1`.`record_id`
            WHERE `data0`.`record_id` = `records`.`id`
              and `data_data_0`.`field_id` = 10
          )
        ) like '%29617192161911%'
      )
    

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

    ויש לי אפשרות להשתמש בhaving עם שמות העמודות בפועל (אחרי הכינוי AS)
    מצד אחד זה יראה הרבה יותר מסודר עם HAVING
    ומצד שני אני לא יודע מה ההשלכות האופטימליות של כל אחת מהאפשרויות
    מה גם שבHAVING אצטרך להשתמש בכל קבוצות השאילתה, אין לי יכולות לפרק בין where ל having כי חלק מהם הם or אחד בשני תלוי.

    dovidD תגובה 1 תגובה אחרונה
    1
    • ש ש.ב.ח.

      שלום וברכה

      יש לי שאילתה שמביאה הרבה צבירות מכל מיני מקומות (ובגלל הגנריות של המערכת אין לי אפשרות אפ' לדעת כמה היא תכיל) וגם חישובים של הצבירות (כלומר צבירה {אופרטור} צבירה)
      הנקודה היא: שאני גם אמור לבצע חיפוש בכל העמודות (בין עמודות הצבירה ובין עמודות רגילות)
      וכאן מגיעה השאלה:
      יש לי אפשרות להשתמש בwhere כך זה בערך נראה:

      WHERE `collection_id` = 6
        and (
          (
            (
              SELECT sum(`meta_records`.`VALUE`)
              FROM `meta_records`
                INNER JOIN `records` AS `laravel_reserved_0` ON `laravel_reserved_0`.`id` = `meta_records`.`record_id`
                INNER JOIN `meta_records` AS `data0` ON `data0`.`record_id` = `laravel_reserved_0`.`id`
              WHERE `records`.`id` = `data0`.`VALUE`
                and `meta_records`.`field_id` = 27
            ) -(
              SELECT sum(`meta_records`.`VALUE`)
              FROM `meta_records`
                INNER JOIN `records` AS `laravel_reserved_1` ON `laravel_reserved_1`.`id` = `meta_records`.`record_id`
                INNER JOIN `meta_records` AS `data1` ON `data1`.`record_id` = `laravel_reserved_1`.`id`
                INNER JOIN `meta_records` AS `data0` ON `data0`.`record_id` = `data1`.`VALUE`
              WHERE `records`.`id` = `data0`.`VALUE`
                and `meta_records`.`field_id` = 23
            )
          ) like '%29617192161911%'
          or (
            (
              (
                SELECT `data_data_0`.`VALUE`
                FROM `meta_records` AS `data_data_0`
                  INNER JOIN `records` AS `records_data2` ON `records_data2`.`id` = `data_data_0`.`record_id`
                  INNER JOIN `meta_records` AS `data0` ON `data0`.`VALUE` = `records_data2`.`id`
                WHERE `data0`.`record_id` = `records`.`id`
                  and `data_data_0`.`field_id` = 10
              ) *(
                SELECT sum(`meta_records`.`VALUE`)
                FROM `meta_records`
                  INNER JOIN `records` AS `laravel_reserved_2` ON `laravel_reserved_2`.`id` = `meta_records`.`record_id`
                  INNER JOIN `meta_records` AS `data0` ON `data0`.`record_id` = `laravel_reserved_2`.`id`
                WHERE `records`.`id` = `data0`.`VALUE`
                  and `meta_records`.`field_id` = 15
              )
            ) + (
              SELECT `data_data_0`.`VALUE`
              FROM `meta_records` AS `data_data_0`
                INNER JOIN `records` AS `records_data2` ON `records_data2`.`id` = `data_data_0`.`record_id`
                INNER JOIN `meta_records` AS `data2` ON `data2`.`VALUE` = `records_data2`.`id`
                INNER JOIN `meta_records` AS `data1` ON `data1`.`VALUE` = `data2`.`record_id`
                INNER JOIN `meta_records` AS `data0` ON `data0`.`VALUE` = `data1`.`record_id`
              WHERE `data0`.`record_id` = `records`.`id`
                and `data_data_0`.`field_id` = 10
            )
          ) like '%29617192161911%'
        )
      

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

      ויש לי אפשרות להשתמש בhaving עם שמות העמודות בפועל (אחרי הכינוי AS)
      מצד אחד זה יראה הרבה יותר מסודר עם HAVING
      ומצד שני אני לא יודע מה ההשלכות האופטימליות של כל אחת מהאפשרויות
      מה גם שבHAVING אצטרך להשתמש בכל קבוצות השאילתה, אין לי יכולות לפרק בין where ל having כי חלק מהם הם or אחד בשני תלוי.

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

      @ש-ב-ח דעתי היא שתשתמש עם having.
      אם יש לך כח לעשות query plan תוכל להכריע ביתר קלות אם הקריאות עדיפה.

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

        @ש-ב-ח דעתי היא שתשתמש עם having.
        אם יש לך כח לעשות query plan תוכל להכריע ביתר קלות אם הקריאות עדיפה.

        ש
        ש
        ש.ב.ח.
        כתב ב נערך לאחרונה על ידי
        #3

        @dovid אני לא יודע מה זה query plan... 😞
        מרפרוף ראשוני בספרי רבינו גוגל הלוי, רגע לפני שאני מעמיק.. זה רלוונטי בmysql?

        חגיח dovidD 2 תגובות תגובה אחרונה
        0
        • ש ש.ב.ח.

          @dovid אני לא יודע מה זה query plan... 😞
          מרפרוף ראשוני בספרי רבינו גוגל הלוי, רגע לפני שאני מעמיק.. זה רלוונטי בmysql?

          חגיח
          חגיח
          חגי
          כתב ב נערך לאחרונה על ידי
          #4

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

          תגובה 1 תגובה אחרונה
          2
          • ש ש.ב.ח.

            @dovid אני לא יודע מה זה query plan... 😞
            מרפרוף ראשוני בספרי רבינו גוגל הלוי, רגע לפני שאני מעמיק.. זה רלוונטי בmysql?

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

            @ש-ב-ח
            ראה פה
            https://softwarearchiblog.com/2017/12/explain.html
            אם אני לא טועה, יש בphpMyAdmin מטה אחרי הרצת שאילתה לשנוית של plan או משהו כזה.

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

              @ש-ב-ח
              ראה פה
              https://softwarearchiblog.com/2017/12/explain.html
              אם אני לא טועה, יש בphpMyAdmin מטה אחרי הרצת שאילתה לשנוית של plan או משהו כזה.

              ש
              ש
              ש.ב.ח.
              כתב ב נערך לאחרונה על ידי
              #6

              @dovid
              אני עדיין לא יודע איך לקרוא את זה...
              אבל זו התוצאה של having:
              78e864f9-2804-4d12-9044-ac77cd18da63-image.png

              וזו (מחולק ל2) התוצאה של where
              03a60ff8-ff6d-44e3-b099-9394eee9558e-image.png
              11d1ddf4-af1b-4b0a-9902-f6ed99f43f32-image.png

              זה שהשורות כמעט כפול 3 זה כבר מראה את התשובה לשאלתי או שאין קשר?

              dovidD תגובה 1 תגובה אחרונה
              0
              • ש ש.ב.ח.

                @dovid
                אני עדיין לא יודע איך לקרוא את זה...
                אבל זו התוצאה של having:
                78e864f9-2804-4d12-9044-ac77cd18da63-image.png

                וזו (מחולק ל2) התוצאה של where
                03a60ff8-ff6d-44e3-b099-9394eee9558e-image.png
                11d1ddf4-af1b-4b0a-9902-f6ed99f43f32-image.png

                זה שהשורות כמעט כפול 3 זה כבר מראה את התשובה לשאלתי או שאין קשר?

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

                @ש-ב-ח גם בשבילי זה די סינית.
                האורך לא בהכרח אומר שזה מסורבל יותר, אבל יש עמודה בה כתוב איך הסינון מתבצע, using index טוב בהרבה מאשר using where ולכאורה זה לטובת הhaving.
                אבל תגיד לי, כמה שורות יש כעת בטבלאות? באיזה סדר גודל מדובר בהווה ובאיזה יהיה בעתיד? כי מנגנון הDB יכול לשנות את צורת הפעולה דרמטית כשיש הבדל משמעותי בכמות השורות ובגודל האינדקסים.

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

                  @ש-ב-ח גם בשבילי זה די סינית.
                  האורך לא בהכרח אומר שזה מסורבל יותר, אבל יש עמודה בה כתוב איך הסינון מתבצע, using index טוב בהרבה מאשר using where ולכאורה זה לטובת הhaving.
                  אבל תגיד לי, כמה שורות יש כעת בטבלאות? באיזה סדר גודל מדובר בהווה ובאיזה יהיה בעתיד? כי מנגנון הDB יכול לשנות את צורת הפעולה דרמטית כשיש הבדל משמעותי בכמות השורות ובגודל האינדקסים.

                  ש
                  ש
                  ש.ב.ח.
                  כתב ב נערך לאחרונה על ידי
                  #8

                  @dovid כרגע אני על המכונה בפיתוח יש שם שורות בודדות מה שאין כן במציאות אולי יהיו גם מיליוני שורות

                  dovidD תגובה 1 תגובה אחרונה
                  0
                  • ש ש.ב.ח.

                    @dovid כרגע אני על המכונה בפיתוח יש שם שורות בודדות מה שאין כן במציאות אולי יהיו גם מיליוני שורות

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

                    @ש-ב-ח אז אין משמעות לבדיקה כעת.
                    לדעתי לך על having וזהו.

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

                    שלום! נראה שהשיחה הזו מעניינת אותך, אבל עדיין אין לך חשבון.

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

                    בעזרת התרומה שלך, הפוסט הזה יכול להיות אפילו טוב יותר 💗

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


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

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

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