Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/57.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 正在获取groupBy中的最后一项_Php_Mysql_Sql_Laravel_Eloquent - Fatal编程技术网

Php 正在获取groupBy中的最后一项

Php 正在获取groupBy中的最后一项,php,mysql,sql,laravel,eloquent,Php,Mysql,Sql,Laravel,Eloquent,我在这里找到了一些我遵循的答案,发现它在本地工作,所以我推到我们的测试箱,在那里我发现这个特定的DB查询通过进入mysql并显示PROCESSLIST持续1300秒以上;它还挂在复制到tmp表上 它是Laravel4.2,相当古老的遗留代码,我只是在开发更高版本时尝试将其稳定化。根据api_调用,下面的代码大约每30秒重复一次,这一切都很好,只是它没有完成并接收到504网关超时。我觉得我在做一些递归的事情,或者搜索一个非常大的数据库会是一个问题吗 我想做的只是运行一个groupBy,而不是按第一

我在这里找到了一些我遵循的答案,发现它在本地工作,所以我推到我们的测试箱,在那里我发现这个特定的DB查询通过进入mysql并显示PROCESSLIST持续1300秒以上;它还挂在复制到tmp表上

它是Laravel4.2,相当古老的遗留代码,我只是在开发更高版本时尝试将其稳定化。根据api_调用,下面的代码大约每30秒重复一次,这一切都很好,只是它没有完成并接收到504网关超时。我觉得我在做一些递归的事情,或者搜索一个非常大的数据库会是一个问题吗

我想做的只是运行一个groupBy,而不是按第一个分组,我想按最后一个分组,以防其他细节被更新

我们将非常感谢您提供的任何帮助

public function api_prevnames()
{
    if (Auth::user()->repeat_vistor == 'Y') {
        $names = DB::table('visitors')
            ->select(DB::raw('first_name,last_name,email,car_reg,OPTIN,vistor_company'))
            ->where('user_id', Auth::user()->id)
            ->where('hidden', 0)
            ->where('email', '<>', '')
            ->whereRaw('id IN (select MAX(id) FROM visitors GROUP BY first_name, last_name, email)')
            ->get();
    }

    return JSONResponseGenerator::successResponse($names->toArray());

}
这将生成此查询

select first_name,last_name,email,car_reg,OPTIN,vistor_company from `visitors` where `user_id` = '439' and `hidden` = '0' and `email` <> '' and id IN (select MAX(id) FROM visitors GROUP BY first_name, last_name, email)
前面的代码运行不到几秒钟,我在下面添加了这段代码:

            $names = DB::table('visitors')
            ->select(DB::raw('first_name,last_name,email,car_reg,OPTIN,vistor_company'))
            ->where('user_id', Auth::user()->id)
            ->where('hidden', 0)
            ->where('email', '<>', '')
            ->groupBy('first_name', 'last_name', 'email')
            ->get();

您可以尝试运行以下操作:

SELECT
    first_name,
    last_name,
    email,
    car_reg,
    OPTIN,
    vistor_company
FROM (
    SELECT
        MAX(id) AS id
    FROM `visitors`
    WHERE
        `user_id` = 439
        AND `hidden` = 0
        AND `email` <> ''
    GROUP BY
        first_name,
        last_name,
        email
) AS subQ
NATURAL JOIN `visitors`;

连接通常比另一种方式更快,但我认为这不会有帮助,因为您显然没有按索引进行分组。要做到这一点,你必须改变结构,我强烈建议你这样做。尽量减少名字、姓氏和电子邮件的最大长度,这样您就可以创建这三者的组合索引。如果您可以更改数据库结构本身而不杀死系统的一半,则应该考虑将该表归一化,比如有一个访问者表和另一个访问外键的访问者关系的访问表。因此,您可以按一个键分组,而不是按三个长度较大的未编制索引的字符串分组。

我还添加了上面的文本查询。绝对可以,mate,完全符合我的需要,而且速度非常快!我已经更新了您的编辑,添加了我在Laravel中修复此问题的确切过程。非常感谢你的帮助。