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