获取groupBy中的最后一项

时间:2018-05-17 15:20:23

标签: php mysql sql laravel eloquent

我在这里找到了一些答案,我发现它在本地工作,所以我推到了我的测试盒,我发现这个特定的数据库查询持续超过1300秒,进入mysql和{{ 1}}它挂在SHOW PROCESSLIST;

这是Laravel 4.2,非常古老的遗留代码,我只是想在更高版本上工作时稳定。根据api_call,下面的代码大约每30秒重复一次,除了它没有完成并接收copying to tmp table之外,这一切都很好,我觉得我正在做一些递归的东西,或者会搜索一个非常大的数据库是一个问题这里吗?

我要做的就是运行一个groupBy,而不是按照我想要分组的第一个分组,以防其他细节被更新。

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

504 Gateway Time-out

生成此查询

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)

1 个答案:

答案 0 :(得分:1)

您可以尝试运行以下内容:

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`;

加入通常比其他方式更快,但我不认为它会有所帮助,因为你显然没有按索引进行分组。要做到这一点,你必须改变结构,我强烈建议这样做。尝试减少first_name,last_name和email的最大长度,以便创建这三者的组合索引。如果您可以更改数据库结构本身而不会占用系统的一半,则应该考虑将此表标准化为具有访问者表和另一个访问者访问者(与外键的关系),因此您可以通过键进行分组用三个未编制索引的字符串进行分组。