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

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

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

mysql מיון אוטומטי על עמודה שהיא חלק מ UNIQUE

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

    תופעה מוזרה שנתקלתי
    יש לי טבלה כזו

    CREATE TABLE `Rooms` (
      `id` int NOT NULL AUTO_INCREMENT,
      `ProjectID` int NOT NULL,
      `num` tinyint NOT NULL,
      `Type` tinyint(1) NOT NULL,
      `ActiveInTheSystem` tinyint(1) NOT NULL,
      `note` varchar(100) COLLATE utf8mb4_unicode_ci NOT NULL,
      `ReleaseTime` int NOT NULL,
      `FirstEntryTime` int NOT NULL,
      PRIMARY KEY (`id`),
      UNIQUE KEY `ProjectID` (`ProjectID`,`num`)
    ) ENGINE=InnoDB AUTO_INCREMENT=43 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci
    

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

    SELECT * FROM `Rooms` 
    

    3e6afffd-bfe0-4a00-ba14-463b18179d0f-image.png

    ולעומת זאת על שאילתה

    SELECT * FROM `Rooms` WHERE `ProjectID`='7'
    

    זה מגיע ממוין לפי הnum ולא לפי הid
    0ea6c025-1e46-4cee-88c8-eacd026079e4-image.png

    איך זה ניהיה? תמיד ידעתי שבmysql אין כלל מיון אוטומטי אלא הוא שולף כסדר ההכנסה, ובעמודה id ניתן לראות בבירור שסדר ההכנסה היה בצורה אחרת ממה שהוא שולף?
    אולי זה קשור לכך שיש UNIQUE על עמודות ProjectID ו num?

      UNIQUE KEY `ProjectID` (`ProjectID`,`num`)
    

    מעניין

    yossizY OdedDvirO 2 תגובות תגובה אחרונה
    0
    • yossizY מנותק
      yossizY מנותק
      yossiz
      השיב לחוקר ב נערך לאחרונה על ידי yossiz
      #2

      @חוקר אמר בmysql מיון אוטומטי על עמודה בשם num:

      אלא הוא שולף כסדר ההכנסה

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

      אולי זה קשור לכך שיש UNIQUE על עמודות ProjectID ו num?

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

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

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

        @חוקר אני לא מספיק מנוסה ב- MySQL, אבל נתקלתי בתפעה באקסס ונראה לי שגם ב-SQLServer.
        ההסבר שלי הוא כך: כאשר עמודה מוגדרת כאינדקס ה-DB ממיין אותה לצורך יעילות חיפוש. ובשאילתת בחירה זה יגרום לפעמים למיון על פי עמודה זו, למרות שלפי הכללים סדר התוצאות לא מוגדר בשאילתא סתמית ללא מיון,
        יתכן כי ה-DB ממין גם עמודות המוגדרות כ-UNIQUE. (זה הגיוני לצורך יעילות הבדיקה בהכנסת ערך חדש)
        כל זה כתבתי מסברא, אשמח לאישוש או הפרכה מהמומחים כאן.

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

          @OdedDvir אמר בmysql מיון אוטומטי על עמודה בשם num:

          אשמח לאישוש או הפרכה מהמומחים כאן

          אני לא מומחה אבל...

          ה-DB ממיין אותה לצורך יעילות חיפוש

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

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

          סדר לא מוגדר לא מחייב שזה לא יצא לפי שום סדר, רק שאי אפשר לסמוך על סדר מסויים

          יתכן כי ה-DB ממין גם עמודות המוגדרות כ-UNIQUE. (זה הגיוני לצורך יעילות הבדיקה בהכנסת ערך חדש)

          עד כמה שאני יודע, UNIQUE תמיד ייצר אינדקס מהטעם שכתבת

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

          OdedDvirO תגובה 1 תגובה אחרונה
          3
          • OdedDvirO מנותק
            OdedDvirO מנותק
            OdedDvir
            השיב לyossiz ב נערך לאחרונה על ידי OdedDvir
            #5

            @yossiz אמר בmysql מיון אוטומטי על עמודה בשם num:

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

            סדר לא מוגדר לא מחייב שזה לא יצא לפי שום סדר, רק שאי אפשר לסמוך על סדר מסויים

            לזה נתכוונתי, תודה על הניסוח המדויק!

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

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

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

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