首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >SQL :按ID合并两行并保留值

SQL :按ID合并两行并保留值
EN

Stack Overflow用户
提问于 2019-07-16 01:49:31
回答 3查看 149关注 0票数 1

我正面临着一个相对简单的问题,但我不能想出一个解决方案。请记住,我正在使用PHP和Laravel框架,如果它能让事情变得更容易的话。

我有一个数据填充表,如下所示:

代码语言:javascript
复制
ID | TRANSACTION_ID | BEACON_TYPE
---+----------------+---------------
 1 |       1        |  "abc"
 2 |       2        |  "def"
 3 |       2        |  "xyz"

我想按事务ID对它们进行分组,并将信标类型保留在数据内部,如下所示:

代码语言:javascript
复制
ID | TRANSACTION_ID | BEACON_TYPE
---+----------------+---------------
 1 |       1        |  "abc"
 2 |       2        |  "def", "xyz"

我尝试过使用group by,但没有效果。关于如何实现这一点有什么想法或提示吗?正如我之前所说的,使用Laravel Eloquent可能会有一些方法来做到这一点。

EN

回答 3

Stack Overflow用户

发布于 2019-07-16 02:45:50

假设您使用的是MySQL,那么您要查找的函数是GROUP_CONCAT()。使用Eloquent,它看起来像这样:

代码语言:javascript
复制
$transactions = DB::table('tableName')
                  ->select('TRANSACTION_ID', DB::raw('GROUP_CONCAT(BEACON_TYPE SEPARATOR ', ') as BEACON_TYPE'))
                  ->groupBy('TRANSACTION_ID')
                  ->get();

请注意,如果您想要更改分隔符,您只需将', '编辑为其他内容。默认分隔符是','

票数 3
EN

Stack Overflow用户

发布于 2019-07-16 02:52:17

使用GROUP_CONCAT()串联组的值。将其SEPARATOR设置为', ',以获取带有逗号分隔值的组。

您的预期结果将丢失一些信息,因为分组行的ID将同时为2和3(在您的示例中)。因此,要么不选择这些ID,要么使用单独的GROUP_CONCAT()添加它们。

原始的SQL查询将使用GROUP_CONCAT()。以下查询使用表foo,请将其替换为您的实际表名。

代码语言:javascript
复制
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方法,所以它变成

代码语言:javascript
复制
$result = DB::table('foo')
            ->select('TRANSACTION_ID',
                      DB::raw("GROUP_CONCAT(BEACON_TYPE SEPARATOR ', '") as BEACON_TYPE)
            ->groupBy('TRANSACTION_ID');

或者,如果要将分组的if包含到中,则..

代码语言:javascript
复制
$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');
票数 3
EN

Stack Overflow用户

发布于 2019-07-16 03:09:11

如果您已经拥有数据库中的数据,并且只想使用collection functions,则可以执行以下操作:

代码语言:javascript
复制
    $things = $things->groupBy('TRANSACTION_ID')
            ->map(function($x) {
                $beaconTypes = $x->implode('BEACON_TYPE', ', ');
                $firstThing = $x->first();
                $firstThing['BEACON_TYPE'] = $beaconTypes;

                return $firstThing;
            });
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57044839

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档