在Laravel查询生成器中,计数无法正常工作

时间:2018-11-09 09:41:26

标签: php sql laravel count laravel-query-builder

我正在尝试获取数据库中有多少个名称。为此,我使用查询生成器是这样的:

$namesIdsCount = DB::table('names_to_options')
    ->select('name_id')
    ->groupBy('name_id')
    ->havingRaw($having)
    ->count();

是说24,这是不正确的,因为如果我要编写这样的代码:

$namesIdsCount = DB::table('names_to_options')
    ->select('name_id')
    ->groupBy('name_id')
    ->havingRaw($having)
    ->get();

结果对象包含247个元素,这是正确的。我尝试过跳/走,但仍然没有结果。我哪里错了?感谢您的帮助。

2 个答案:

答案 0 :(得分:1)

我认为这是相反的,您没有得到24个小组。第一组中有24个元素。该配置导致以下查询:

SELECT
    COUNT(*) AS 'aggregate',
    `name_id`
FROM `names_to_options`
WHERE EXISTS(
    {your $havingRaw sub-query}
)
GROUP BY `name_id`;

最终得到的结果将如下所示:

+---------------+---------+
| aggregate     | name_id |
+---------------+---------+
| 24            | 1       |
+---------------+---------+
| 5             | 2       |
+---------------+---------+
| 30            | 3       |
+---------------+---------+
| ... and so on | 4       |
+---------------+---------+

Query\Builder只是没有意识到当涉及count()时,您可以获得一个以上的结果。

尽管如此,您还是很接近正确的答案。

$namesIdsCount = DB::table('names_to_options')
    ->select('name_id')
    ->groupBy('name_id')
    ->havingRaw($having)
    ->get();

get()返回Eloquent\Collection的子元素Support\Collection,它具有自己的count方法版本。所以你的答案就是:

$namesIdsCount = DB::table('names_to_options')
    ->select('name_id')
    ->groupBy('name_id')
    ->havingRaw($having)
    ->get()
    ->count();

如果您确实希望在MySQL中发生这种情况,则您希望发生的查询如下所示:

SELECT COUNT(*) FROM (
    SELECT
        `name_id`
    FROM `names_to_options`
    WHERE EXISTS(
        {your $havingRaw sub-query}
    )
    GROUP BY `name_id`
) AS temp;

为此,您可以执行以下操作:

$query = DB::table('names_to_options')
    ->select('name_id')
    ->groupBy('name_id')
    ->havingRaw($having);
$sql = $query->toSql();
$values = $query->getBindings();
$count = DB::table(DB::raw('('.$sql.') AS `temp`'))
    ->selectRaw("COUNT(*) AS 'aggregate'", $values)
    ->first()
    ->aggregate;

当要求MySQL编写这样的临时表时,MySQL的性能可能会有些毛躁,因此您必须尝试看看哪个选项更快。

答案 1 :(得分:0)

犬烧是对的

(id,name_id),

(1,1),

(2,1)

(3,2)

(4,3)

有四行,所以get()方法将返回四行

但是如果使用groupBy [name_id]

,则分为三个组

1(1,1)

2(2)

3(3)

现在计数将返回3

希望这会有所帮助。