gpt4 book ai didi

php - 获取 groupBy 中的最后一项

转载 作者:行者123 更新时间:2023-11-29 17:34:39 25 4
gpt4 key购买 nike

我在这里找到了一些我遵循的答案,发现它在本地工作,所以我将其推送到我们的测试箱,在其中我发现这个特定的数据库查询通过进入 mysql 和持续了 1300 秒以上>SHOW PROCESSLIST; 并且它卡在复制到临时表

这是 Laravel 4.2,相当旧的遗留代码,我只是在开发更高版本时试图稳定它。下面的代码根据 api_call 大约每 30 秒重复一次,这一切都很好,只是它没有完成并收到 504 Gateway Time-out 我觉得我正在做一些递归的事情或者会搜索一个非常大的数据库会是一个问题吗?

我想做的就是运行一个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`;

连接通常比其他方式更快,但我认为这不会有帮助,因为您显然没有按索引分组。为此,您必须更改结构,我强烈建议您这样做。尝试减少first_name、last_name和email的最大长度,这样您就可以创建这三者的组合索引。如果您可以更改数据库结构本身而不会杀死一半的系统,那么您应该考虑规范化该表,例如拥有一个包含访问者的表和另一个包含这些访问者的访问的表(与外键的关系),这样您就可以按键分组由三个长度很大的无索引字符串进行分组。

关于php - 获取 groupBy 中的最后一项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50395066/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com