我在mysql中构建了以下查询。并尝试了很多转换为laravel但没有成功。
SELECT u.id, u.purchase_item_name,u.sales_item_name, us.type,
GROUP_CONCAT(p.itemcode) AS purchase_items,
GROUP_CONCAT(s.itemcode) as sales_items
FROM composite_inventories as u
LEFT JOIN composite_has_inventories as us ON u.id = us.composite_inventory_id
LEFT JOIN inventories as s ON US.inventory_id = s.id AND us.type='sale'
LEFT JOIN inventories as p ON US.inventory_id = p.id AND us.type='purchase'
GROUP BY u.id
我正在尝试上面查询laravel datatabel查询,但它给出了如下错误。
SQLSTATE [42000]:语法错误或访问冲突:1055' saas.composite_inventories.purchase_item_name'不在GROUP BY中(SQL:选择GROUP_CONCAT(p.itemcode)作为purchase_items,GROUP_CONCAT(s.itemcode)作为sales_items,composite_inventories
。id
,composite_inventories
。{{ 1}},purchase_item_name
。composite_inventories
,sales_item_name
。us
来自type
,加入composite_inventories
作为composite_has_inventories
us
} {。{1}} = composite_inventories
。id
在[{1}} us
上composite_inventory_id
左inventories
加入s
。US
= {{1} {。inventory_id
和s
。id
='在us
上type
inventories
左右加入p
。{{ 1}} = US
。inventory_id
和p
。id
='按us
购买'分组type
)
我在laravel查询下尝试过。
composite_inventories
我刚试过下面的查询
id
以上查询在显示数据表时有效。但是当我尝试搜索过滤器时,它会给出以下错误,因为purchase_items和sales_items字段在数据库中不存在但只是别名。错误是
异常消息:↵↵SQLSTATE[42000]:语法错误或访问冲突:1583对本机函数的调用中的参数不正确' LOWER' (SQL:选择计数为聚合来自(选择
$result = Compositeinventory::select([ DB::raw('GROUP_CONCAT(p.itemcode) as purchase_items'), DB::raw('GROUP_CONCAT(s.itemcode) as sales_items'), 'composite_inventories.id', 'composite_inventories.purchase_item_name', 'composite_inventories.sales_item_name', 'us.type' ])->leftJoin('composite_has_inventories as us', 'composite_inventories.id', '=', 'us.composite_inventory_id') ->leftJoin('inventories as s', function($join) { $join->on('US.inventory_id', '=', 's.id'); $join->on('us.type','=',DB::raw("'sale'")); }) ->leftJoin('inventories as p', function($join) { $join->on('US.inventory_id', '=', 'p.id'); $join->on('us.type','=',DB::raw("'purchase'")); }) ->groupBy('composite_inventories.id')->get();
。$row = DB::table('composite_inventories as u')->select([ 'u.id', 'u.purchase_item_name', 'u.sales_item_name', DB::raw('GROUP_CONCAT(p.itemcode) as purchase_items'), DB::raw('GROUP_CONCAT(s.itemcode) as sales_items') ])->leftJoin('composite_has_inventories as us', 'u.id', '=', 'us.composite_inventory_id') ->leftJoin('inventories as s', function($join) { $join->on('US.inventory_id', '=', 's.id'); $join->on('us.type','=',DB::raw("'sale'")); }) ->leftJoin('inventories as p', function($join) { $join->on('US.inventory_id', '=', 'p.id'); $join->on('us.type','=',DB::raw("'purchase'")); }) ->groupBy('u.id', 'u.purchase_item_name','u.sales_item_name');
,u
。id
,u
。purchase_item_name
,GROUP_CONCAT(p。 itemcode)作为purchase_items,GROUP_CONCAT(s.itemcode)作为u
的sales_items,sales_item_name
将composite_inventories
作为u
composite_has_inventories
us
u
id
。 =us
。composite_inventory_id
在[{1}}inventories
=s
。US
上inventory_id
左加入s
id
。us
='促销'在[{1}}type
上inventories
p
。US
= {{1} }。inventory_id
和p
。id
='购买'其中(LOWER(us
为type
)LIKE%a%或LOWER (composite_inventories
为u.purchase_item_name
)LIKE%a%或LOWER(composite_inventories
为u.purchase_items
)LIKE%a%或LOWER(composite_inventories
为u.sales_item_name
)composite_inventories
u.sales_items
,u
,id
,u
。purchase_item_name
)count_row_table)
答案 0 :(得分:3)
这不是laravel的问题,您的查询无效,因为它包含一些未聚合且未在group子句中提及的列。要更正此问题,您需要将group by子句更新为
group by u.id, u.purchase_item_name,u.sales_item_name, us.type
在查询构建器
中->groupBy('composite_inventories.id', 'composite_inventories.purchase_item_name','composite_inventories.sales_item_name', 'composite_has_inventories.type')
如果每个composite_inventories有多个type
(s),那么我猜你也需要GROUP_CONCAT,并从group by子句中删除这个列。
更新语法错误,您没有正确使用lower函数只需将要转换为值的列名称传递给小写,如
WHERE (
LOWER(u.purchase_item_name) LIKE '% a %'
OR LOWER(u.purchase_items) LIKE '% a %'
OR LOWER(u.sales_item_name`) LIKE '% a %'
OR LOWER(u.sales_items) LIKE '% a %'
)
如果您的数据库排序规则未设置为区分大小写,则无需使用lower()功能获取更多信息,请查看B.5.4.1 Case Sensitivity in String Searches
此外,如果您在查询中使用mysql fucntions,则可能需要使用laravel的查询构建器的raw()
方法