Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/58.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在node.js中嵌套MySQL返回的结果_Mysql_Node.js - Fatal编程技术网

如何在node.js中嵌套MySQL返回的结果

如何在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

我正在angular和Node.js中制作一个应用程序。我有两个表中的数据

  • 电子邮件
  • 电子邮件附件
  • 假设我在
    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附件
    ,但我懒得把它写在这里。。。无论如何:后者更有趣,前者更安全