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_id
fromyour_electricity_yesterday_category
left joincategory
ascategory
onyour_electricity_yesterday_category
.category_id
=category
.id
whereyour_electricity_yesterday_category
.category_id
= 11 andyour_electricity_yesterday_category
.building_id
= 52 andyour_electricity_yesterday_category
.category_id
not in (selectcategory_id
frombuilding_category_settings
wherebuilding_id
= 52 andhide_from_electricity_widget
= 1 group bycategory_id
order bykwh_used
desc))",
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.