【发布时间】:2019-04-26 14:19:29
【问题描述】:
我有搜索应用程序,从 itemregistrationpangkat 表中查找已按某些标准(类别、经验年数等)过滤的个人信息:
itemregistrationpangkatID|itemregistrationID|NegeriID|yeartamatkhidmat|yearmulakhidmat
--------------------------------------------------------------------------
1 | 2 | Kedah | 2001 | 2002
2 | 2 | Kedah | 2003 | 2007
3 | 3 | Melaka | 2008 | 2012
4 | 3 | Melaka | 2013 | 2018
5 | 4 | KL | 2000 | 2001
itemregistrationID | name | SectionID | CategoryID
-----------------------------------------------------------
1 | Eric | 1 | 2
2 | Tom | 2 | 4
3 | Anne | 2 | 4
4 | Marie | 3 | 2
5 | Bill | 1 | 3
最后一个过滤器“negeri 的 tempoh perkhidmatan”有问题。我需要按州(negeri)计算工作经验的数量。例如,当在 state(negeri) 'x' 中搜索 5 年的人时,sql 将汇总所选州中每个人的经验年限。
这是按条件进行 SQL 搜索的完整代码:
$query = DB::table('itemregistrations')
->join('sections', 'itemregistrations.SectionID', '=', 'sections.SectionID')
->join('categories', 'itemregistrations.CategoryID', '=', 'categories.CategoryID')
->join('operasi', 'itemregistrations.OperasiID', '=', 'operasi.OperasiID')
->join('negeri', 'itemregistrations.NegeriID', '=', 'negeri.NegeriID')
->join('gred', 'itemregistrations.GredID', '=', 'gred.GredID')
->where('itemregistrations.statusProID', '=', 1)
->select('itemregistrations.name','sections.sectionname', 'categories.categoryname', 'operasi.operasiname', 'itemregistrations.Nobadan', 'itemregistrations.lahir_yy', 'itemregistrations.pdrm_yy', 'gred.namagred', 'itemregistrations.itemRegistrationID', '');
if($request->input('negeri_lahir') != ''){
$query->where('itemregistrations.NegeriID', $request->input('negeri_lahir'));
}
if($request->input('kategori') != '') {
$query->where('itemregistrations.CategoryID', $request->input('kategori'));
}
if($request->input('pangkat') != '') {
$query->where('itemregistrations.OperasiID', $request->input('pangkat'));
}
if(request('umur')) {
$query->whereRaw('YEAR(CURDATE()) - lahir_yy >= ?', [request('umur')]);
}
if($request->input('gred') != '') {
$query->where('itemregistrations.GredID', $request->input('gred'));
}
if(request('tempoh')) {
$query->whereRaw('YEAR(CURDATE()) - pdrm_yy >= ?', [request('tempoh')]);
}
if($request->input('negeri_perkhidmatan') != '') {
$query->join('itemregistrationpangkat', 'itemregistrationpangkat.itemRegistrationID', '=', 'itemregistrations.itemRegistrationID')
->where('itemregistrationpangkat.NegeriID', $request->input('negeri_perkhidmatan'));
}
if(request('tempoh_negeri')) {
$query->select(DB::raw('m.itemRegistrationID, sum(m.duration)'))
->from(DB::raw('(SELECT itemRegistrationID, NegeriID, yeartamatkhidmat - yearmulakhidmat as duration FROM itemregistrationpangkat) AS m
RIGHT JOIN itemregistrations ON itemregistrations.itemRegistrationID=m.itemRegistrationID'))
->distinct()
->groupBy('m.itemRegistrationID');
}
$newitem = $query->get();
return response::json($newitem);
需要解决的代码是这个(最后一个过滤器):
if(request('tempoh_negeri')) {
$query->select(DB::raw('m.itemRegistrationID, sum(m.duration)'))
->from(DB::raw('(SELECT itemRegistrationID, NegeriID, yeartamatkhidmat - yearmulakhidmat as duration FROM itemregistrationpangkat) AS m
RIGHT JOIN itemregistrations ON itemregistrations.itemRegistrationID=m.itemRegistrationID'))
->distinct()
->groupBy('m.itemRegistrationID');
}
问题是重复的行。 上面的控制台日志显示:
0:
itemRegistrationID: 791
sum(m.duration): 6
假设:
0:
itemRegistrationID: 791
sum(m.duration): 3
distinct() 不适用于 groupby,如果我删除 groupby,它可以删除重复的行。
【问题讨论】:
-
那么,你解决了吗?
-
不,重复仍然存在。我需要群比。我不能单独使用 distinct()
-
如果我看到你最后一个查询,你正在做一个
RIGHT JOIN。是否有特殊原因需要RIGHT JOIN?因为你知道它会从连接的右侧返回所有值,对吧? -
如果
distinct()被删除了怎么办?它会给出正确的值吗?您可以在SELECT中使用SUM(DISTINCT m.duration)吗? -
我用表格更新了问题,并删除了 distinct()。我尝试了您的建议,使用 distinct in sum 并且有效!卓见!我不知道在 sum() 中可以使用 distinct。
标签: mysql laravel-5 group-by distinct