我正面临着一个相对简单的问题,但我不能想出一个解决方案。请记住,我正在使用PHP和Laravel框架,如果它能让事情变得更容易的话。
我有一个数据填充表,如下所示:
ID | TRANSACTION_ID | BEACON_TYPE
---+----------------+---------------
1 | 1 | "abc"
2 | 2 | "def"
3 | 2 | "xyz"
我想按事务ID对它们进行分组,并将信标类型保留在数据内部,如下所示:
ID | TRANSACTION_ID | BEACON_TYPE
---+----------------+---------------
1 | 1 | "abc"
2 | 2 | "def", "xyz"
我尝试过使用group by,但没有效果。关于如何实现这一点有什么想法或提示吗?正如我之前所说的,使用Laravel Eloquent可能会有一些方法来做到这一点。
发布于 2019-07-16 02:45:50
假设您使用的是MySQL,那么您要查找的函数是GROUP_CONCAT()
。使用Eloquent,它看起来像这样:
$transactions = DB::table('tableName')
->select('TRANSACTION_ID', DB::raw('GROUP_CONCAT(BEACON_TYPE SEPARATOR ', ') as BEACON_TYPE'))
->groupBy('TRANSACTION_ID')
->get();
请注意,如果您想要更改分隔符,您只需将', '
编辑为其他内容。默认分隔符是','
。
发布于 2019-07-16 02:52:17
使用GROUP_CONCAT()
串联组的值。将其SEPARATOR
设置为', '
,以获取带有逗号分隔值的组。
您的预期结果将丢失一些信息,因为分组行的ID
将同时为2和3(在您的示例中)。因此,要么不选择这些ID,要么使用单独的GROUP_CONCAT()
添加它们。
原始的SQL查询将使用GROUP_CONCAT()
。以下查询使用表foo
,请将其替换为您的实际表名。
SELECT TRANSACTION_ID,
GROUP_CONCAT(BEACON_TYPE SEPARATOR ', ') AS BEACON_TYPE
FROM foo
GROUP BY TRANSACTION_ID
使用Eloquent,您需要使用DB::raw()
来选择GROUP_CONCAT()
部件,因为没有用于GROUP_CONCAT()
的Eloquent方法,所以它变成
$result = DB::table('foo')
->select('TRANSACTION_ID',
DB::raw("GROUP_CONCAT(BEACON_TYPE SEPARATOR ', '") as BEACON_TYPE)
->groupBy('TRANSACTION_ID');
或者,如果要将分组的if包含到中,则..
$result = DB::table('foo')
->select('TRANSACTION_ID',
DB::raw("GROUP_CONCAT(BEACON_TYPE SEPARATOR ', '") as BEACON_TYPE),
DB::raw("GROUP_CONCAT(ID SEPARATOR ', '") as ID)
->groupBy('TRANSACTION_ID');
发布于 2019-07-16 03:09:11
如果您已经拥有数据库中的数据,并且只想使用collection functions,则可以执行以下操作:
$things = $things->groupBy('TRANSACTION_ID')
->map(function($x) {
$beaconTypes = $x->implode('BEACON_TYPE', ', ');
$firstThing = $x->first();
$firstThing['BEACON_TYPE'] = $beaconTypes;
return $firstThing;
});
https://stackoverflow.com/questions/57044839
复制相似问题