Php 计数在Laravel查询生成器中未按预期工作

Php 计数在Laravel查询生成器中未按预期工作,php,sql,laravel,count,laravel-query-builder,Php,Sql,Laravel,Count,Laravel Query Builder,我正在尝试获取数据库中有多少个名称。为此,我使用的查询生成器如下所示: $namesIdsCount = DB::table('names_to_options') ->select('name_id') ->groupBy('name_id') ->havingRaw($having) ->count(); $namesIdsCount = DB::table('names_to_options') ->select('n

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

$namesIdsCount = DB::table('names_to_options')
    ->select('name_id')
    ->groupBy('name_id')
    ->havingRaw($having)
    ->count();
$namesIdsCount = DB::table('names_to_options')
    ->select('name_id')
    ->groupBy('name_id')
    ->havingRaw($having)
    ->get();
+---------------+---------+
| aggregate     | name_id |
+---------------+---------+
| 24            | 1       |
+---------------+---------+
| 5             | 2       |
+---------------+---------+
| 30            | 3       |
+---------------+---------+
| ... and so on | 4       |
+---------------+---------+
SELECT COUNT(*) FROM (
    SELECT
        `name_id`
    FROM `names_to_options`
    WHERE EXISTS(
        {your $havingRaw sub-query}
    )
    GROUP BY `name_id`
) AS temp;
是说24,这是不正确的,因为如果我写这样的代码:

$namesIdsCount = DB::table('names_to_options')
    ->select('name_id')
    ->groupBy('name_id')
    ->havingRaw($having)
    ->count();
$namesIdsCount = DB::table('names_to_options')
    ->select('name_id')
    ->groupBy('name_id')
    ->havingRaw($having)
    ->get();
+---------------+---------+
| aggregate     | name_id |
+---------------+---------+
| 24            | 1       |
+---------------+---------+
| 5             | 2       |
+---------------+---------+
| 30            | 3       |
+---------------+---------+
| ... and so on | 4       |
+---------------+---------+
SELECT COUNT(*) FROM (
    SELECT
        `name_id`
    FROM `names_to_options`
    WHERE EXISTS(
        {your $havingRaw sub-query}
    )
    GROUP BY `name_id`
) AS temp;
结果对象包含247个元素,这是正确的。我尝试过使用skip/take,但仍然没有结果。我错在哪里?谢谢你的帮助。

Inuyaki是对的

(身份证、姓名和身份证)

(1,1)

(2,1)

(3,2)

(4,3)

共有四行,因此get()方法将返回4行

但是如果使用groupBy[name\u id],则有三个组

1(1,1)

2(2)

3(3)

现在计数将返回3


希望这会有所帮助。

我认为情况正好相反,你没有得到24个小组。第一组中有24个元素。该配置将导致以下查询:

SELECT
    COUNT(*) AS 'aggregate',
    `name_id`
FROM `names_to_options`
WHERE EXISTS(
    {your $havingRaw sub-query}
)
GROUP BY `name_id`;
您最终得到的结果将如下所示:

$namesIdsCount = DB::table('names_to_options')
    ->select('name_id')
    ->groupBy('name_id')
    ->havingRaw($having)
    ->count();
$namesIdsCount = DB::table('names_to_options')
    ->select('name_id')
    ->groupBy('name_id')
    ->havingRaw($having)
    ->get();
+---------------+---------+
| aggregate     | name_id |
+---------------+---------+
| 24            | 1       |
+---------------+---------+
| 5             | 2       |
+---------------+---------+
| 30            | 3       |
+---------------+---------+
| ... and so on | 4       |
+---------------+---------+
SELECT COUNT(*) FROM (
    SELECT
        `name_id`
    FROM `names_to_options`
    WHERE EXISTS(
        {your $havingRaw sub-query}
    )
    GROUP BY `name_id`
) AS temp;
Query\Builder
只是没有意识到当涉及到
count()
时,可以返回多个结果

不过你自己也很接近正确答案

$namesIdsCount = DB::table('names_to_options')
    ->select('name_id')
    ->groupBy('name_id')
    ->havingRaw($having)
    ->get();
get()。所以你的答案是:

$namesIdsCount = DB::table('names_to_options')
    ->select('name_id')
    ->groupBy('name_id')
    ->havingRaw($having)
    ->get()
    ->count();
如果您真的希望在MySQL中发生这种情况,那么您希望发生的查询如下所示:

$namesIdsCount = DB::table('names_to_options')
    ->select('name_id')
    ->groupBy('name_id')
    ->havingRaw($having)
    ->count();
$namesIdsCount = DB::table('names_to_options')
    ->select('name_id')
    ->groupBy('name_id')
    ->havingRaw($having)
    ->get();
+---------------+---------+
| aggregate     | name_id |
+---------------+---------+
| 24            | 1       |
+---------------+---------+
| 5             | 2       |
+---------------+---------+
| 30            | 3       |
+---------------+---------+
| ... and so on | 4       |
+---------------+---------+
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编写这样的临时表时,它的性能可能会有点不稳定,因此您必须进行实验,看看哪个选项更快。

having
$having的值是什么?@Jerodev它包含我自定义的sql语句,比如
SUM(CASE when option_id IN({$optionSql}),然后1 ELSE 0 END)>0和SUM(CASE when option_id IN IN.)({$optionSql})然后1 ELSE 0 END)>0
,其中,
$optionSql
是一个ID用coma分隔的字符串。首先使用get()方法运行查询,然后对$namesidscont集合中的值进行计数,即count($namesidscont)我的第一个猜测是groupBy会产生24个组,Ali说,计数是多少($namesidscont)这是绝对正确的,非常感谢你向我解释!