我正在尝试使用口才,我在产生预期结果方面遇到了问题。 说实话,我会告诉你我拥有什么,我想要什么以及我做了什么。但是,也许还有另一种方法可以做我想做的事情,我也很乐意对它进行测试。 :)
我有什么: 我有一张桌子,就是:
+----+------------+--------------+---------------+---------------------+---------------------+
| id | machine_id | balance_left | balance_found | created_at | updated_at |
+----+------------+--------------+---------------+---------------------+---------------------+
| 1 | 1 | 12.30 | 12.30 | 2016-01-26 16:39:18 | 2016-01-28 16:39:18 |
| 2 | 2 | 45.60 | 45.60 | 2016-01-26 16:39:18 | 2016-01-28 16:39:18 |
| 3 | 3 | 78.90 | 78.90 | 2016-01-26 16:40:22 | 2016-01-28 16:40:22 |
| 4 | 4 | 90.12 | 90.12 | 2016-01-26 16:40:22 | 2016-01-28 16:40:22 |
| 5 | 1 | 5.60 | 3.40 | 2016-01-28 17:30:33 | 2016-01-28 17:30:33 |
| 6 | 2 | 7.89 | 4.56 | 2016-01-28 17:30:33 | 2016-01-28 17:30:33 |
+----+------------+--------------+---------------+---------------------+---------------------+
我需要什么: 给定一个日期,我确实需要获得最新的结果,并且需要使用'balance_left'。 但是,将machine_id作为唯一条目。 例如,如果我在23:59通过日期26/01,我希望收到ID为1,2,3和4的行。并且,SUM将为12.30 + 45.60 + 78.90 + 90.12 = 226.92。 现在,如果我在23:59通过日期28/01,我希望收到ID为3,4,5和6的行。一旦条目5和6是machine_id 1和2的最新条目。在这种情况下,总和将是:78.90 +90.12 + 5.60 + 7.89 = 182.51
我做了什么:
$sub = App\Transaction::orderBy('created_at','DESC');
$transcations = DB::table(DB::raw("({$sub->toSql()}) as sub"))->where('created_at','<=', '2016-01-28 23:59:59')->groupBy('machine_id')->sum('balance_left');
没有SUM,但是使用了select('balance_left'),我得到了正确的行:
=> [
{#672
+"balance_left": 5.6,
},
{#671
+"balance_left": 7.89,
},
{#643
+"balance_left": 78.9,
},
{#677
+"balance_left": 90.12,
},
]
问题在于,当我要求总和时,我得到了:
=> 17.9
过了一会儿,我发现实际上,他正在做一个machine_id条目的总和,所以ID为1和5的行有machine_id 1,然后这个总和是12.30 +5.60 = 17.90的总和
问题: 我怎样才能真正SUM返回的行?或者,还有其他更好的方式来回报我期待的东西吗?
非常感谢!