所以我有下面的查询,它是有效的:
Expense::select('amount', 'date', DB::raw('COUNT(*) as `count`'))
->groupBy('amount', 'date')
->havingRaw('COUNT(*) > 1')
->get();
这是为了获取所有可能重复的expenses
(相同的金额和相同的日期)。但是,我想获取所有内容,而不仅仅是amount
和date
。以下内容不起作用:
return Expense::select('name', 'amount', 'date', DB::raw('COUNT(*) as `count`'))
->groupBy('amount', 'date')
->havingRaw('COUNT(*) > 1')
->get();
这将给予我这个错误:
SQLSTATE[42000]: Syntax error or access violation: 1055 Expression #1 of the SELECT list is not in the GROUP BY clause and contains a nonaggregated column
我想在视图中列出Expense
的更多字段,最重要的当然是名称,还有slug,这样我就可以链接到每个潜在的重复项,等等。
还有,第二个“问题”,但不是最重要的,是使用上面的查询,所有的费用都在一个集合中返回。例如,它们不是按日期分组的。
最理想的结果是这样的,所有可能重复的数据都应该按日期分组,这样我就可以在我的视图中执行类似的操作:
@foreach($duplicates as $date => $expenses)
@foreach($expenses as $expense)
{{ $date }}
// List all expenses for that date.. etc.
问题1:如何使上述查询适用于所有数据库字段,而不仅仅是date
和amount
?
问题2:我如何能够获取潜在的重复项并按日期对它们进行分组,以便像上面的示例那样循环日期和费用?
1条答案
按热度按时间tv6aics11#
进行分组时始终正确处理列
即,可以指定要在groupBy中选择的所有字段
或者类似于组合属于所需分组的列
如果您只想按日期对它们进行分组,但仍有实际的重复行,则只需添加另一个select语句来计算日期重复,而不在查询中按日期对它们进行分组,然后在集合中进行日期分组。
即
然后,输出应包含另一列
duplicates
,其中包含每个日期的重复次数,并且仍包含重复日期的所有行