I have this Query which i am trying to execute
$other = $this->electricityConnections->select('category_id')
->from('building_category_settings')
->where('building_id', '=', 52)
->where('hide_from_electricity_widget', '=', 1)
->groupBy('category_id')
->orderBy('kwh_used', 'desc');
$electCategory = $this->electricityConnections
->addselect(('MIN(IF(category.description IS NOT NULL,
category.description, your_electricity_yesterday_category.cat_desc)
as cat_desc'),
('SUM(kwh_used) as kwh_used'), ('SUM(cost) as cost'),
'your_electricity_yesterday_category.category_id')
->leftJoin('category as category',
'your_electricity_yesterday_category.category_id', '=', 'category.id')
->where('your_electricity_yesterday_category.category_id', '=', 11)
->where('your_electricity_yesterday_category.building_id', '=', 52)
->whereNotIn('your_electricity_yesterday_category.category_id', $other)
->get();
dd($electCategory);
But i keep getting this error
"message": "SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '.
cat_desc)ascat_desc,SUM(kwh_used)askwh_used,SUM(cost)ascost' at line 1 (SQL: selectMIN(IF(category.description IS NOT NULL, category.description, your_electricity_yesterday_category.cat_desc)ascat_desc,SUM(kwh_used)askwh_used,SUM(cost)ascost,your_electricity_yesterday_category.category_idfromyour_electricity_yesterday_categoryleft joincategoryascategoryonyour_electricity_yesterday_category.category_id=category.idwhereyour_electricity_yesterday_category.category_id= 11 andyour_electricity_yesterday_category.building_id= 52 andyour_electricity_yesterday_category.category_idnot in (selectcategory_idfrombuilding_category_settingswherebuilding_id= 52 andhide_from_electricity_widget= 1 group bycategory_idorder bykwh_useddesc))",
When I do toSql() to the code above I get the following below
"select `MIN(IF(category`.`description IS NOT NULL, category`.`description, your_electricity_yesterday_category`.`cat_desc)` as `cat_desc`, `SUM(kwh_used)` as `kwh_used`, `SUM(cost)` as `cost`, `your_electricity_yesterday_category`.`category_id` from `your_electricity_yesterday_category` left join `category` as `category` on `your_electricity_yesterday_category`.`category_id` = `category`.`id` where `your_electricity_yesterday_category`.`category_id` = ? and `your_electricity_yesterday_category`.`building_id` = ? and `your_electricity_yesterday_category`.`category_id` not in (select `category_id` from `building_category_settings` where `building_id` = ? and `hide_from_electricity_widget` = ? group by `category_id` order by `kwh_used` desc)"
What am i doing wrong?
CodePudding user response:
I think the main problem is the addSelect part. You're missing a closing ) for MIN. Try using DB::raw when the selected columns include sql functions.
addselect(
DB::raw('MIN(IF(category.description IS NOT NULL, category.description, your_electricity_yesterday_category.cat_desc)) as cat_desc'),
DB::raw('SUM(kwh_used) as kwh_used'),
DB::raw('SUM(cost) as cost'),
'your_electricity_yesterday_category.category_id'
)
CodePudding user response:
you are missing parentheses from end of below line
MIN(IF(category.description IS NOT NULL, category.description, your_electricity_yesterday_category.cat_desc)) as cat_desc
you need to close bracket before as cat_desc, this seems to be syntax issue.
CodePudding user response:
You Can Use selectRaw, check docs: https://laravel.com/docs/9.x/queries#selectraw
->selectRaw("
MIN(IF(category.description IS NOT NULL, category.description, your_electricity_yesterday_category.cat_desc)) as cat_desc),
SUM(kwh_used) as kwh_used,
SUM(cost) as cost),
your_electricity_yesterday_category.category_id
")
CodePudding user response:
. is a keyword in SQL. You may not used it as a column name without quoting it. In MySQL, things like column names are quoted using backticks, i.e. . with ``
Personally, I wouldn't bother; I'd just rename the column.
