SQL:按一些ID合并两行并保留值

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (15)

我面临一个相对容易的问题,但我无法绕过一个解决方案。请记住,我正在使用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来做。

提问于
用户回答回答于

假设您正在使用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();

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

用户回答回答于

使用GROUP_CONCAT()来连接该组的值。给它SEPARATOR', '获得与逗号分隔值的组。

您的预期结果将丢失一些信息,因为ID分组行的s将分别为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()部分,因为没有Eloquent方法GROUP_CONCAT(),所以它变成

$result = DB::table('foo')
            ->select('TRANSACTION_ID',
                      DB::raw("GROUP_CONCAT(BEACON_TYPE SEPARATOR ', '") as BEACON_TYPE)
            ->groupBy('TRANSACTION_ID');

或者如果你想包括分组的ID,那么..

$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');

扫码关注云+社区

领取腾讯云代金券