ספירת כמות רשומות למספר רשומות קיבוץ
-
יש לי טבלת
folders
המכילה מידע אודות תיקיות
לכל רשומה יש שדהfolder_id
(לדוגמא 1234), המכיל מזהה ייחודי, ובנוסףfolder_tree
המציין את נתיב התיקיה החל מתיקית השורש (לדוגמא \123\1234)
אני מעוניין לשלוף בשאילתה את כמות התיקיות משנה שיש מתחת לכל תיקיה. מה שאומר ששורה אחת יכולה להיספר ב count של כמה רשומות
כרגע אני משתמש עם שאילתה כבדה יחסית, אני שולף בשאילתת משנה את כל טבלת התיקיות כפול עצמה, עם פילטר שיציג רק רשומות שהfolder_id
מופיע בשדהfolder_tree
ואז סוכםזוהי השאילתה:
select folder_id, count(*) count_sub_folders from (SELECT folders.folder_id,folders.folder_tree FROM folders,folders as folders2 where folders2.folder_tree like concat('%',folders.folder_id,'%')) folders3 group by folder_id
זוהי הטבלה:
וזה השאילתה שאני מעוניין להציג:
(הכמות כוללת את התיקיה עצמה)השאלה אם יש דרך למטב את השאילתה, בשני אפשרויות: או כתיבה אחרת של השליפה, או כתיבה אחרת של טבלת
folders
-
-
@מומחה-באקסס אין לי תשובה מקיפה בינתיים
יש לי אבל כמה הערות לבינתיים:
אם זו השאילתה שאתה משתמש ייתכן שזה כבר מייתר את השאלה הקודמת שלך, כי אפשר למטב את זה מאוד- זה לא נכון להשתמש ב-
'%LIKE '%XXX
כי אין דרך להשתמש באינדקס עבור שאילתה כזו
במקרה שלך יש אפשרות פשוטה להימנע מזה, פשוט תשתמש בנתיב המלא של התקייה במקום ה-id שלו
where folders2.folder_tree like concat(folders.folder_tree,'%')
זה מאפשר להשתמש באינדקס כי ה-wildcard רק לבסוף - יש פה בזבוז משאבים: הסיכום של כל תיקייה בנוייה מהסיכום של כל התיקייות שמתחתיו, יוצא שיש חישוב חוזר ונשנה של אותו מידע (יש לזה פתרון עם recursive cte או משהו כזה, אני לא בקי, רק זורק משהו מהזכרון, יש הרבה כתבות ברשת על איך לנהל מידע בצורת עץ במסד SQL-י)
- זה לא נכון להשתמש ב-
-
@yossiz
זו לא ממש השאילתה בה אני משתמש, אבל בדוגמא הזו הדגמתי את הבעיתיות שבפרוייקט שלי- לא ידעתי שישנה דרך להשתמש ב LIKE גם עבור שדה אינדקס, זה בהחלט פתרון מצוין!
חשבתי על פתרון של טבלת מיפוי שתכיל את כל הצירופים בין תיקית אב לתיקית משנה כל שהיא.
השאלה אם ברמת משאבים זה ימטב, או שזה מגיע לאותה התוצאה של השאילתה הנ"ל.
מצד אחד בשאילתה הזו הוא מכפיל עבור כל רשומה את כל הטבלה, אבל מצד שני הוא מפלטר רק על התיקיות שתחתיו, אז בשורה תחתונה הוא מסכם את אותו מספר רשומות. רק כמובן יש את הפעולה של הפילטור בעצמה. -
@מומחה-באקסס כתב בספירת כמות רשומות למספר רשומות קיבוץ:
זו לא ממש השאילתה בה אני משתמש
אם יש שינוי משמעותי, תביא אותו אחרת לא נוכל לדון ביחד כאשר חלק מהשאלה עלומה
חשבתי על פתרון של טבלת מיפוי שתכיל את כל הצירופים בין תיקית אב לתיקית משנה כל שהיא.
נראה לי שזה מיותר ולא יעזור פה, המידע כבר קיים בצורה די מיטבית (לפחות לצורך השאילתה שהבאת, ב-SQL SERVER יש DATATYPE מיוחד לצורך זה, אבל ב-MYSQL אין משהו אחר)
הפתרון אמור להיות recursive cte אאל"ט (עדיין התעצלתי מלבדוק)
עריכה:
הנה כמה תוצאות חיפוש: