【问题标题】:Using a CONCAT with GROUP_CONCAT将 CONCAT 与 GROUP_CONCAT 一起使用
【发布时间】:2019-01-09 12:54:51
【问题描述】:

我必须将一些数据导出到 Excel 文件。该数据来自一个名为“tb_Forms”的表,并在另一个名为“tb_Movement”的表中有多重关系,如下所示

+----------+----------+ | tb_Forms | | +----------+----------+ |表单 ID |说明 | | 1 | “表格 1” | | 2 | "表格 2" | | 3 | “表格 3” | +----------+----------+ +-----------------+---------------+--------------- ----+--------------+--------+---------- --+ | tb_运动 | | | | | | +-----------------+---------------+--------------- ----+--------------+--------+---------- --+ |运动标识 |第一个答案 |第二个答案 |回复日期 |用户Fk | FormsFk | | 1 | “Lorem Ipsum” | "dolor sat amet" | 2018-07-31 | 1 | 1 | | 2 | “结构” | “阿迪皮斯精英” | 2018-08-01 | 2 | 1 | +-----------------+---------------+--------------- ----+--------------+--------+---------- --+ +----------+----------+ | tb_用户 | | +----------+----------+ |用户名 |姓名 | | 1 |若昂席尔瓦 | | 2 |玛丽亚奥利维拉 | +----------+----------+

我想找到一种方法来获得两个结果,例如:

结果 第一句话:“Lorem Ipsum”, 第二句话:João Silva 于 2018-07-31 发表的“dolor sit amet” 第一句话:“consectetur”, 第二条评论:玛丽亚·奥利维拉(Maria Oliveira)于 2018-08-01 发表的“adipiscing elit”

但我只能得到第一个结果(João Silva),仅此而已。 这是我做的查询:

SELECT GROUP_CONCAT(CONCAT(
    "First Remark: ", mv.FirstRemark,
    "\rSecond Remark: ", mv.SecondRemark,
    "\rin ", mv.ResponseDate, " by ",
    (SELECT Name FROM tb_Users WHERE UserId = mv.UserFk)
) SEPARATOR ',')
FROM tb_Movement mv 
WHERE mv.FormsFk = 1;

我已经试过了:

SET SESSION group_concat_max_len = 1000000;

..因为备注字段可能非常大,但这似乎不是解决方案。

我必须像这样连接所有答案,因为每个表单行也必须是 excel 中的唯一行。

【问题讨论】:

    标签: mysql sql concat group-concat


    【解决方案1】:

    我会推荐:

    SELECT GROUP_CONCAT('First Remark: ', mv.FirstRemark,
                        '\rSecond Remark: ', mv.SecondRemark,
                        '\rin ', mv.ResponseDate, 
                        ' by ', u.name
                        SEPARATOR ','
                       )
    FROM tb_Movement mv LEFT JOIN
         tb_Users u
         ON u.userId = mv.UserFK
    WHERE mv.FormsFk = 1;
    

    注意事项:

    • SQL 中的标准字符串分隔符是单引号。
    • GROUP_CONCAT() 处理多个参数,因此 CONCAT() 不是必需的。
    • 您需要使用JOIN。在聚合查询中使用相关子查询会产生意外结果或错误 - 两者都是不可取的。
    • LEFT JOIN 更接近您的意图,因此不会过滤掉 NULL 外键引用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-11-23
      • 2014-08-18
      • 1970-01-01
      • 2015-01-21
      • 1970-01-01
      • 1970-01-01
      • 2014-01-28
      • 2012-01-05
      相关资源
      最近更新 更多