如何在node.js中嵌套MySQL返回的结果
我正在angular和Node.js中制作一个应用程序。我有两个表中的数据如何在node.js中嵌套MySQL返回的结果,mysql,node.js,Mysql,Node.js,我正在angular和Node.js中制作一个应用程序。我有两个表中的数据 电子邮件 电子邮件附件 假设我在emails表中有一行,如下所示: id | subject | body | 1 | text | text body | 和电子邮件附件表格如下所示: email_id | attachment_id | attachment_name | 1 | 1 | attachment
emails
表中有一行,如下所示:
id | subject | body |
1 | text | text body |
和电子邮件附件
表格如下所示:
email_id | attachment_id | attachment_name |
1 | 1 | attachment.pdf |
1 | 2 | second.txt |
现在,当我像这样查询这些表时:
从电子邮件e中选择e.*,ea.*
左加入电子邮件附件ea ON ea.email\u id=e.id
其中e.id='${id}'
它返回的重复结果与电子邮件附件中的行数相同。但是我想从email
表中获取一行,然后在结果的末尾追加一个对象数组,其中包含email\u附件中匹配的行数
预期产出
{
id: 1,
subject: text,
body: text body,
email_attachments:[
{
email_id: 1,
attachment_id: 1,
attachment_name: attachment.pdf
},{
email_id: 1,
attachment_id: 2,
attachment_name: second.txt
}
]
}
这样我就可以显示所有详细信息,然后循环查看email\u attachment
object以显示电子邮件中的所有附件。我已经尝试了节点mysql嵌套
包。它根据我的要求格式化返回的结果,但它仅从电子邮件附件中添加1行。我想得到该对象中所有匹配的行<代码>节点mysql嵌套
配置选项与我使用的类似
var nestingOptions = [
{ tableName : 'emails', pkey: 'id', fkeys:[{table:'ea',col:'email_id'}]},
{ tableName : 'ea', pkey: 'email_id'}
];
var nestedRows = mysqlNesting.convertToNested(result, nestingOptions);
嵌套或查询是否有任何问题需要修改?任何其他解决方案都是受欢迎的,因为我只关心输出。谢谢一个干净的解决方案是在节点代码中接收格式时转换格式
let output = [];
rawRowsFromMySQL.forEach((row) => { // suppose rawRowsFromMySQL is an array of objects, keys are field names
let data = output.find((document) => {
return document.id === row.id;
});
let att = {
email_id: row.id, // or .email_id
attachment_id: row.attachment_id,
attachment_name: row.attachment_name
};
if (data) {
data.email_attachments.push(att);
} else {
data = {
id: row.id,
subject: row.subject,
body: row.body,
email_attachments: [att]
};
output.push(data);
}
});
可能有一个有限的(参见链接文档)解决方案,那么节点的转换代码将非常简单;查询如下所示:
SELECT
e.id, e.subject, e.body,
GROUP_CONCAT(
CONCAT_WS(':', ea.email_id, ea.attachment_id, ea.attachment_name)
SEPARATOR ','
) AS email_attachments
FROM emails e
LEFT JOIN email_attachments ea ON ea.email_id = e.id
WHERE xxx
GROUP BY e.id
然后,您的节点代码将替换:
let output = rawRowsFromMySQL.map((row) => {
row.email_attachments = row.email_attachments.split(',').map((att) => {
let fields = att.split(':');
return {
email_id: fields[0],
attachment_id: fields[1],
attachment_name: fields[2]
};
});
})
你甚至可以玩CONCAT
/CONCAT\u WS
来获得JSON格式的email\u附件
,但我懒得把它写在这里。。。无论如何:后者更有趣,前者更安全