שליפת נתונים מטבלה עם 3 טבלאות מקושרות
-
לכל טבלה שמייצגת מודעה יש:
טבלה של ערים - לפי הID של המודעה
טבלה של נקרא/לא נקרא - לפי הID של המודעה - כאן חוזרות גם המודעות שנקרא וגם אלו שלא אלא שהן מחולקות לנקראו ולא נקראו
טבלה של דירוג - לפי מספר הטלפון של המפרסםהשאילתה אמורה להוסיף את כל הנתונים מכל הטבלאות
אם מעבירים כפרמטר ערך לסינון (כמו עיר או אזור מסוימים, מספר טלפון מפרסם, מספר טלפון של מי ששומע את המודעות ועוד) אז המודעות צריכות להיות מסוננות (לדוגמא יופיעו רק מודעות מחיפה ולא מכל הארץ כמו אילו לא שלחו עיר לסינון)
השאלה איך נכון לעשות את זה.
במצב הנוכחי (הקוד שכתבתי) אם לא שלחו עיר כפרמטר, בכלל לא מחברים את הטבלה, מה שגורם לזה שחוזרות מודעות, אבל בלי ערים.
-
לכל טבלה שמייצגת מודעה יש:
טבלה של ערים - לפי הID של המודעה
טבלה של נקרא/לא נקרא - לפי הID של המודעה - כאן חוזרות גם המודעות שנקרא וגם אלו שלא אלא שהן מחולקות לנקראו ולא נקראו
טבלה של דירוג - לפי מספר הטלפון של המפרסםהשאילתה אמורה להוסיף את כל הנתונים מכל הטבלאות
אם מעבירים כפרמטר ערך לסינון (כמו עיר או אזור מסוימים, מספר טלפון מפרסם, מספר טלפון של מי ששומע את המודעות ועוד) אז המודעות צריכות להיות מסוננות (לדוגמא יופיעו רק מודעות מחיפה ולא מכל הארץ כמו אילו לא שלחו עיר לסינון)
השאלה איך נכון לעשות את זה.
במצב הנוכחי (הקוד שכתבתי) אם לא שלחו עיר כפרמטר, בכלל לא מחברים את הטבלה, מה שגורם לזה שחוזרות מודעות, אבל בלי ערים.
@eido הדילמה כאן היא קלאסית של סינון דינמי עם טבלאות מקושרות.
הטעות הנפוצה היא שמשנים את ה-JOIN לפי הפרמטרים שנשלחים. בפועל ה-JOIN צריך להיות קבוע, והסינון צריך להתבצע רק ב-WHERE.
כלל אצבע פשוט: JOIN משמש להבאת מידע, WHERE משמש לסינון מידע.
לכן נכון לחבר תמיד את כל הטבלאות הרלוונטיות (בדרך כלל עם LEFT JOIN), ואז לכתוב את תנאי הסינון
במצב כזה, אם לא נשלח פרמטר – אין סינון, אבל הנתונים מהטבלאות המקושרות עדיין חוזרים. אם כן נשלח פרמטר – מתבצע סינון כמצופה.
עוד משהו, אם יש טבלה שבה יש כמה רשומות לכל מודעה (למשל סטטוס נקרא/לא נקרא לפי מאזין), JOIN רגיל עלול לגרום לכפילויות של מודעות. במצבים כאלה עדיף לבצע את הסינון באמצעות EXISTS, תחפש על זה.
-
@eido הדילמה כאן היא קלאסית של סינון דינמי עם טבלאות מקושרות.
הטעות הנפוצה היא שמשנים את ה-JOIN לפי הפרמטרים שנשלחים. בפועל ה-JOIN צריך להיות קבוע, והסינון צריך להתבצע רק ב-WHERE.
כלל אצבע פשוט: JOIN משמש להבאת מידע, WHERE משמש לסינון מידע.
לכן נכון לחבר תמיד את כל הטבלאות הרלוונטיות (בדרך כלל עם LEFT JOIN), ואז לכתוב את תנאי הסינון
במצב כזה, אם לא נשלח פרמטר – אין סינון, אבל הנתונים מהטבלאות המקושרות עדיין חוזרים. אם כן נשלח פרמטר – מתבצע סינון כמצופה.
עוד משהו, אם יש טבלה שבה יש כמה רשומות לכל מודעה (למשל סטטוס נקרא/לא נקרא לפי מאזין), JOIN רגיל עלול לגרום לכפילויות של מודעות. במצבים כאלה עדיף לבצע את הסינון באמצעות EXISTS, תחפש על זה.
@אביי תודה רבה
מבחינת עומס על השרת, AI למיניהם טענו שכ"כ הרבה join מהוה עומס על השרת ומכביד סתם על כל תהליך השליפה, מה שא"כ אם חלק מהם עושים ע"י בקשה שניה בקוד עצמו.גם מבחינת עבודה עם knex, זה עדיין טוב? אם הסינון לא מוגדר צמוד לטבלה איך מגדירים שהוא יהיה דוקא עליו ולא על טבלה אחרת? אני מרגיש שknex פחות טוב לדברים כאלה, קצת מסבך את העסק בתנאים שקצת טיפה מורכבים.