MYSQL中与MSSQL的STUFF和XML PATH等效的函数是什么?

4

我有一个MSSQL数据库,想要将其转换/迁移到MySQL。

我遇到了以下错误信息:

Error Number: 1064

You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'XML PATH(''), TYPE).value('.', 'NVARCHAR(MAX)'), 1, 1, '') FROM (SELECT a3t' at line 10

SELECT DISTINCT task_id, members = STUFF(( SELECT N', ' + t.Ful FROM (SELECT teamAlpha.task_id, ( users.firstname   + ' ' + users.lastname ) as Ful FROM teamAlpha JOIN users ON users.user_id = teamAlpha.user_id ) t WHERE t.task_id = u.task_id FOR XML PATH(''), TYPE).value('.', 'NVARCHAR(MAX)'), 1, 1, '') FROM (SELECT teamAlpha.task_id, ( users.firstname + ' ' + users.lastname ) as Ful FROM teamAlpha JOIN users ON users.user_id = teamAlpha.user_id ) u      

以下是代码:

这是代码:

    $query = $this->db->query("
 SELECT DISTINCT
 task_id,
 members = STUFF((
      SELECT N', ' + t.Ful
      FROM (SELECT teamAlpha.task_id,
                     ( users.firstname  + ' ' + users.lastname ) as Ful
                FROM  teamAlpha
                JOIN users ON users.user_id = teamAlpha.user_id ) t
      WHERE t.task_id = u.task_id   
      FOR XML PATH(''), TYPE).value('.', 'NVARCHAR(MAX)'), 1, 1, '')
FROM 
(SELECT teamAlpha.task_id,
         ( users.firstname  + ' ' + users.lastname ) as Ful
    FROM  teamAlpha
    JOIN users ON users.user_id = teamAlpha.user_id ) u");

    return $query->result();

在MySQL中,STUFF()和XML PATH(''), TYPE).value('.', 'NVARCHAR(MAX)'), 1, 1, ''的等效函数是什么?非常感谢您的帮助。

ROFL。我从未见过有人以这种方式提出这个问题。通常都是“如何在SQL Server中创建一个类似于使用GROUP_CONCAT在MySQL中的分隔列表”。 - Sean Lange
@SeanLange 是的。也许今天在Stack Overflow上是反义词日。 - Tim Biegeleisen
1个回答

8

看起来你想要生成一个CSV人员列表,该列表与你的表中给定任务相关。你可以尝试以下查询:

SELECT
    ta.task_id,
    GROUP_CONCAT(u.firstname, ' ', u.lastname) AS fullname
FROM teamAlpha ta
INNER JOIN users u
    ON u.user_id = ta.user_id
GROUP BY
    ta.user_id;

注意使用 FOR XML PATH 的丑陋之处消失了。虽然 SQL Server 对分析函数有很好的支持,但它对组合聚合操作的支持并不太好。在 SQL Server 2017 中,有一个新的函数 STRING_AGG,基本上与 MySQL 的 GROUP_CONCAT 做的事情是一样的。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接