将 CONCAT 与 GROUP_CONCAT 结合使用
Using a CONCAT with GROUP_CONCAT
我必须将一些数据导出到 excel 文件。此数据来自名为 "tb_Forms" 的 table 并且在另一个名为 "tb_Movement" 的 table 中具有多重关系,如下所示
+----------+---------------------+
| tb_Forms | |
+----------+---------------------+
| FormsId | Description |
| 1 | "form 1" |
| 2 | "form 2" |
| 3 | "form 3" |
+----------+---------------------+
+-----------------+---------------+-------------------+--------------+--------+-----------------------+
| tb_Movement | | | | | |
+-----------------+---------------+-------------------+--------------+--------+-----------------------+
| MovementId | FirstAnswer | SecondAnswer | ResponseDate | UserFk | FormsFk |
| 1 | "Lorem Ipsum" | "dolor sit amet" | 2018-07-31 | 1 | 1 |
| 2 | "consectetur" | "adipiscing elit" | 2018-08-01 | 2 | 1 |
+-----------------+---------------+-------------------+--------------+--------+-----------------------+
+----------+---------------------+
| tb_Users | |
+----------+---------------------+
| UserId | Name |
| 1 | João Silva |
| 2 | Maria Oliveira |
+----------+---------------------+
我想找到一种方法来获得两个结果,例如:
Result
First Remark: "Lorem Ipsum",
Second Remark: "dolor sit amet" in 2018-07-31 by João Silva
First Remark: "consectetur",
Second Remark: "adipiscing elit" in 2018-08-01 by Maria Oliveira
但我只能得到第一个结果(来自 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 中的唯一行。
我会推荐:
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
外键引用未被过滤掉。
我必须将一些数据导出到 excel 文件。此数据来自名为 "tb_Forms" 的 table 并且在另一个名为 "tb_Movement" 的 table 中具有多重关系,如下所示
+----------+---------------------+ | tb_Forms | | +----------+---------------------+ | FormsId | Description | | 1 | "form 1" | | 2 | "form 2" | | 3 | "form 3" | +----------+---------------------+
+-----------------+---------------+-------------------+--------------+--------+-----------------------+ | tb_Movement | | | | | | +-----------------+---------------+-------------------+--------------+--------+-----------------------+ | MovementId | FirstAnswer | SecondAnswer | ResponseDate | UserFk | FormsFk | | 1 | "Lorem Ipsum" | "dolor sit amet" | 2018-07-31 | 1 | 1 | | 2 | "consectetur" | "adipiscing elit" | 2018-08-01 | 2 | 1 | +-----------------+---------------+-------------------+--------------+--------+-----------------------+
+----------+---------------------+ | tb_Users | | +----------+---------------------+ | UserId | Name | | 1 | João Silva | | 2 | Maria Oliveira | +----------+---------------------+
我想找到一种方法来获得两个结果,例如:
Result First Remark: "Lorem Ipsum", Second Remark: "dolor sit amet" in 2018-07-31 by João Silva First Remark: "consectetur", Second Remark: "adipiscing elit" in 2018-08-01 by Maria Oliveira
但我只能得到第一个结果(来自 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 中的唯一行。
我会推荐:
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
外键引用未被过滤掉。