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