2014-10-11 46 views
2

我有以下查询。为什么会这样呢?洋洋洒洒数()始终返回1

这里是DB::getQueryLog()原始查询:

select 
    count(*) as aggregate 
from 
    `items` 
     left join 
    `inventory` ON `items`.`id` = `inventory`.`item_id` 
group by `items`.`id` 
+1

Count获取查询返回的行数。如果您只有一个项目和多个库存条目,则它将始终返回1,因为您正在按items.id进行分组。你有没有尝试过使用SUM()? – 2014-10-11 14:50:24

+0

我需要知道物品的行数,而不是行的库存(这是可选的)。库存表目前为空。只是为了看看这个连接是否搞乱了这个,我把它和'inventory.quantity'列删除了。如果我只是将其更改为'get()',则在返回结果中有20个项目时,仍然向我显示'count()= 1'。 – eComEvo 2014-10-11 14:52:48

+0

@VladCazacu我刚刚发现,如果我从查询中删除'groupBy('items.id')',我会得到一个准确的计数。事实上,我注意到,如果我在任何表上的任何查询上使用'groupBy',那么在count上只会得到1。 – eComEvo 2014-10-11 15:09:57

回答

0

是,count只返回1行,一如既往。

你可能会想:

Item::select(['items.id as id', 'inventory.quantity as quantity']) 
->leftJoin('inventory', 'items.id', '=', 'inventory.item_id') 
->groupBy('items.id') 
->lists('quantity', 'id'); 

这将返回一个阵列id钥匙,和quantity作为值。否则使用get,但如果要分组结果,则不使用count

+0

我实际上需要将返回用于分页的行数。我习惯于'count'只返回一行,查询返回的行数有多少。例如,在这种情况下,我希望单行使用#20的单列。然而,在这种情况下,'count'返回一个行列表,每行只有#'1'。这不仅弄乱了我对这个查询的结果,而且还搞乱了Bllim Datatables中的结果,这样当Datatables自动获取它时,分页不起作用。 – eComEvo 2014-10-11 15:49:59

+0

你知道聚合如何与group by子句一起工作吗? – 2014-10-11 16:43:53

+0

看起来,这将对组中的每条记录进行计数,而不是对结果集中的所有记录进行计数。看起来我需要删除'groupBy'子句并修改'select'来代替'DISTINCT items.id'? – eComEvo 2014-10-11 18:04:19