Having OR Where
-
שלום וברכה
יש לי שאילתה שמביאה הרבה צבירות מכל מיני מקומות (ובגלל הגנריות של המערכת אין לי אפשרות אפ' לדעת כמה היא תכיל) וגם חישובים של הצבירות (כלומר צבירה {אופרטור} צבירה)
הנקודה היא: שאני גם אמור לבצע חיפוש בכל העמודות (בין עמודות הצבירה ובין עמודות רגילות)
וכאן מגיעה השאלה:
יש לי אפשרות להשתמש ב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 אחד בשני תלוי. -
שלום וברכה
יש לי שאילתה שמביאה הרבה צבירות מכל מיני מקומות (ובגלל הגנריות של המערכת אין לי אפשרות אפ' לדעת כמה היא תכיל) וגם חישובים של הצבירות (כלומר צבירה {אופרטור} צבירה)
הנקודה היא: שאני גם אמור לבצע חיפוש בכל העמודות (בין עמודות הצבירה ובין עמודות רגילות)
וכאן מגיעה השאלה:
יש לי אפשרות להשתמש ב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 אחד בשני תלוי. -
@ש-ב-ח דעתי היא שתשתמש עם having.
אם יש לך כח לעשות query plan תוכל להכריע ביתר קלות אם הקריאות עדיפה. -
@dovid אני לא יודע מה זה query plan...
מרפרוף ראשוני בספרי רבינו גוגל הלוי, רגע לפני שאני מעמיק.. זה רלוונטי בmysql? -
@dovid אני לא יודע מה זה query plan...
מרפרוף ראשוני בספרי רבינו גוגל הלוי, רגע לפני שאני מעמיק.. זה רלוונטי בmysql? -
@ש-ב-ח
ראה פה
https://softwarearchiblog.com/2017/12/explain.html
אם אני לא טועה, יש בphpMyAdmin מטה אחרי הרצת שאילתה לשנוית של plan או משהו כזה. -
@dovid
אני עדיין לא יודע איך לקרוא את זה...
אבל זו התוצאה של having:
וזו (מחולק ל2) התוצאה של where
זה שהשורות כמעט כפול 3 זה כבר מראה את התשובה לשאלתי או שאין קשר?
@ש-ב-ח גם בשבילי זה די סינית.
האורך לא בהכרח אומר שזה מסורבל יותר, אבל יש עמודה בה כתוב איך הסינון מתבצע, using index טוב בהרבה מאשר using where ולכאורה זה לטובת הhaving.
אבל תגיד לי, כמה שורות יש כעת בטבלאות? באיזה סדר גודל מדובר בהווה ובאיזה יהיה בעתיד? כי מנגנון הDB יכול לשנות את צורת הפעולה דרמטית כשיש הבדל משמעותי בכמות השורות ובגודל האינדקסים. -
@ש-ב-ח גם בשבילי זה די סינית.
האורך לא בהכרח אומר שזה מסורבל יותר, אבל יש עמודה בה כתוב איך הסינון מתבצע, using index טוב בהרבה מאשר using where ולכאורה זה לטובת הhaving.
אבל תגיד לי, כמה שורות יש כעת בטבלאות? באיזה סדר גודל מדובר בהווה ובאיזה יהיה בעתיד? כי מנגנון הDB יכול לשנות את צורת הפעולה דרמטית כשיש הבדל משמעותי בכמות השורות ובגודל האינדקסים. -
@dovid כרגע אני על המכונה בפיתוח יש שם שורות בודדות מה שאין כן במציאות אולי יהיו גם מיליוני שורות