0

!有三张桌子

  1. 库存 在此处输入图像描述
  2. 仓库 在此输入图片描述
  3. inventory_has_warehouses 在此处输入图片描述

我有用laravel yajra datatable我需要在inventory_has_warehouses数据透视表中对starting_balance这个字段进行求和和搜索

我的代码:

    $id = Auth::user()->id;

        $row = Inventory::with('contact')->with('warehouse')
        ->select(
          'inventories.*',
          DB::raw('SUM(inventory_has_warehouses.starting_balance) as total') 
        )
        ->leftJoin('inventory_has_warehouses', 'inventory_has_warehouses.inventory_id', '=', 'inventories.id')
        ->leftJoin('warehouses', 'warehouses.id', '=', 'inventory_has_warehouses.warehouse_id')
        ->where('inventories.subscriber_id',$id)
        ->groupBy('inventories.id');

        $datatable = DataTables::of($row)

        ->filterColumn('total', function($query, $keyword) {
            $query->whereRaw('sum(inventory_has_warehouses.starting_balance) like ?', ['%'.$keyword.'%']);

        })

        return $datatable->make(true);

但我发现了这种类型的错误

异常消息:↵↵SQLSTATE [HY000]:一般错误:1111 无效使用组函数(SQL:选择计数()作为聚合来自(选择 inventories,SUM(inventory_has_warehouses.starting_balance)作为来自inventories左连接inventory_has_warehouses的 总和inventory_has_warehousesinventory_id= inventoriesid左连接warehouseson warehouses. id= inventory_has_warehouses. warehouse_idwhere inventories. subscriber_id= 2 and inventories. status= 1 and (LOWER( inventories. itemcode) LIKE %1% or LOWER( inventories. purchasedescription) LIKE %1% or exists (select * from contactswhere inventories. supplier= contacts. idand LOWER( contacts. name) LIKE %1% ) 或 (sum(inventory_has_warehouses.starting_balance) like %1%)) 分组 inventories. id) count_row_table)

mysql查询

选择库存。,SUM(inventory_has_warehouses.starting_balance) 作为库存的总和,在inventory_has_warehouses.inventory_id = inventory.id 上加入inventory_has_warehouses,在warehouses.id =inventory_has_warehouses.warehouse_id 上离开加入仓库,其中inventories.subscriber_id = 2 和inventories.status = 1 和( LOWER(inventories.itemcode) LIKE %1% or LOWER(inventories.purchasedescription) LIKE %1% or exists (select * from contacts where inventory.supplier = contacts.id and LOWER(contacts.name) LIKE %1%) 或 ( sum(inventory_has_warehouses.starting_balance) like %1%)) group by inventory.id

4

2 回答 2

1
$id = Auth::user()->id;
        $row = DB::table('inventories')->select('inventories.*','contacts.name',DB::raw('SUM(inventory_has_warehouses.starting_balance) as total'))
            ->leftJoin('contacts', 'inventories.supplier', '=', 'contacts.id')
            ->leftJoin('inventory_has_warehouses', 'inventories.id', '=', 'inventory_has_warehouses.inventory_id')
            ->where('inventories.subscriber_id',$id)
            ->groupBy('inventory_has_warehouses.inventory_id');

if ($keyword = $request->get('search')['value']) {
            $row->having(DB::raw('SUM(inventory_has_warehouses.starting_balance)'), 'like', '%'.$keyword.'%');
            $row->orHaving('inventories.itemcode', 'like', '%'.$keyword.'%');
            $row->orHaving('inventories.purchasedescription', 'like', '%'.$keyword.'%');
            $row->orHaving('contacts.name', 'like', '%'.$keyword.'%');
          }

$datatable = DataTables::of($row)

->filterColumn('total', function($query, $keyword) {
        })

return $datatable->make(true);
于 2018-05-02T07:26:13.390 回答
0

尝试按inventory_has_warehouses.inventory_id 分组

编辑答案:

您真的很难让某人阅读您的查询并为您提供帮助,但在这里更正您的查询是一个重新格式化的查询,其中包含更正:

SELECT 
inventories.*, 
SUM(inventory_has_warehouses.starting_balance) as total 
FROM
inventories LEFT JOIN inventory_has_warehouses 
ON 
inventory_has_warehouses.inventory_id = inventories.id LEFT JOIN warehouses 
ON
warehouses.id = inventory_has_warehouses.warehouse_id 
WHERE
inventories.subscriber_id = 2 
AND
inventories.status = 1 
AND
(LOWER(inventories.itemcode) LIKE '%1%' or LOWER(inventories.purchasedescription) 
LIKE '%1%' OR EXISTS 
(SELECT 
* 
FROM
contacts 
WHERE
inventories.supplier = contacts.id 
AND
LOWER(contacts.name) LIKE '%1%') 
OR
(SUM(inventory_has_warehouses.starting_balance) LIKE '%1%')) GROUP BY inventories.id

您发送的查询的问题是您的like 语句只有这个:

LIKE %1%

该语句需要字符串,它只说:

inventories.

这应该特定于您需要的列,或者只使用 inventory.* 来显示该表的所有列,但该错误仍然没有意义,因为它说:

select count() as aggregate

也许其中一个可以解决,但是在重新格式化您的代码时,我首先注意到语法错误,但这是非常基本的,也许您现在可以开始运行一个非常简单的查询,这可能是适合您的查询:

SELECT 
    inventories.id AS inventory_id,
    warehouses.id,
    SUM(inventory_has_warehouses.starting_balance) AS total
    FROM
    inventories LEFT JOIN inventory_has_warehouses
    ON inventories.id = inventory_has_warehouses.inventory_id
    LEFT JOIN
    warehouses 
    ON warehouses.id = inventory_has_warehouses.warehouse_id
    GROUP BY
    inventory_has_warehouses.inventory_id

从这里开始一一添加条件,直到再次出现错误(在 mysql 查询窗口上执行此操作,而不是通过 laravel 代码)尚不确定 laravel 如何处理 sql 查询,但您发送的格式确实会导致错误,如果您要去在这里发布一个问题,确保它对读者友好,否则有人可能会抨击你,导致它难以阅读格式不正确的代码。;)

还有一件事我忘了确保inventories.id 是该表的主键,否则这仍然会导致您出错,请参阅此链接以获取更多详细信息https://dev.mysql.com/doc/refman/5.7/ zh/group-by-handling.html

于 2018-04-27T08:06:19.660 回答