【问题标题】:AWS Aurora DB Combine Data from Multiple SQL StatementsAWS Aurora DB 组合来自多个 SQL 语句的数据
【发布时间】:2021-02-21 10:45:05
【问题描述】:

我有三个带有数据架构的表,例如:

TABLE user (
    user_id BINARY(16) PRIMARY KEY NOT NULL,
    created DATETIME NOT NULL, 
    last_updated DATETIME,
    coordinator BINARY(16),
    num_updates INT NOT NULL
);


TABLE summary (
    user_id BINARY(16) PRIMARY KEY NOT NULL,
    calculation_time DATETIME NOT NULL,
    calculation_method VARCHAR(25) NOT NULL,
    label VARCHAR(50) NOT NULL,
    critical_count INT NOT NULL,
    median_risk FLOAT(10)
);

TABLE actions(
        user_id BINARY(16) PRIMARY KEY NOT NULL,
        label VARCHAR(50) NOT NULL,
        access_count INT NOT NULL,
        median  FLOAT(10)
    );

所有用户的数据(用户表)通过以下方式简单地使用 lambda 处理函数获取:

const AWS = require('aws-sdk');
const rdsDataService = new AWS.RDSDataService();

module.exports.hello = async (event, context, callback) => {
  const req_id = "5a9dbfca-74d6-471a-af27-31beb4b53bb2";
  const sql = 'SELECT * FROM user WHERE user_id=:id';

  try {
    const params = {
      resourceArn: 'arn:aws:rds:us-west-********************',
      secretArn: 'arn:aws:secretsmanager:us-west**************',
      sql,
      database: 'dev_db1',
      continueAfterTimeout: true,
      includeResultMetadata: true,
      parameters: [{ 'name': 'id', 'value': { 'stringValue': `${req_id}` } }]
    }

    const db_res = await rdsDataService.executeStatement(params).promise();
    
    const convertToJson = (dbresponse) => {
    const columns = dbresponse.columnMetadata.map(col => col.name);
    const row_data = dbresponse.records.map(row => {
        const json_obj = {};
        row.map((val, i) => {
            json_obj[columns[i]] = Object.values(val)[0];
        });
        return json_obj;
    });
    return row_data;
    };
    
    const modified_data = convertToJson(db_res);

    const response = {
      body: {
        statusCode: 200,
        message: 'Data fetched successfully',
        data: modified_data,
      }
    };

    callback(null, response);

  } catch (error) {
    console.log('Error Received', error);
    const error_res = {
      body: {
        statusCode: error.statusCode,
        message: error.message,
        data: null
      }
    }
    callback(null, error_res);
  }
};

如果对另一个表 summaryactions 遵循相同的操作,它也可以工作。现在,我需要将这三个表的所有列组合起来,然后返回数据(返回的行应该在req_id的基础上匹配)。 我的工作 sn-p:https://dbfiddle.uk/?rdbms=mysql_5.7&fiddle=016ecc94c792611fbaca810605e81a6a

但获得的最终结果包含重复形式的列user_id,即包含三次。我不需要将同一列重复三次。

我对处理 MySQL 查询有点陌生,所以即使表存在也无法找出错误的确切原因。 Aurora使用的MYSQL版本是5.7。

感谢任何解决此问题的帮助!

【问题讨论】:

    标签: mysql node.js amazon-web-services amazon-aurora


    【解决方案1】:

    试试这个

    SELECT users.*, summary.* from users, summary WHERE users.user_id = summary.user_id
    

    SELECT * from users, summary WHERE users.user_id = summary.user_id 
    

    【讨论】:

    • 忘记将代码标记为代码 sn-p,因为未显示星号。即使这样也可以 SELECT * from users, summary WHERE users.user_id = summary.user_id
    【解决方案2】:

    计划 A:明确指定所需的列。额外的好处:您可以摆脱 id,这对于阅读输出的其他人来说往往是无用的。

    B 计划:(此选项并非总是可行的。)而不是 JOIN .. ON t1.a = t2.a,比如 JOIN .. USING(a)

    我喜欢使用短别名。这是一起做所有事情:

    SELECT  u.last_name,  u.first_name, 
            s.risk_score,
            t.likes
        FROM  user AS u
        JOIN  summary AS s  USING(user_id)
        LEFT JOIN  test AS t  USING(user_id)
    

    一般来说,1:1 的关系是不明智的(就像你通过user_id 所做的那样);您也可以将所有列都放在一个表中。

    【讨论】:

    • 其实我不想一一显式选择列名。因为在实际情况下,所有三个或更多表都将包含超过 4-5 列。单独提取所有列名会很笨拙。那么,我有什么办法可以做到select * from t1, t2, t3.... 等等?
    • Plan B -- USING(id) 完全符合您的要求 -- 避免重复显示 id
    • 是的,您的回答完全贴切,解决了重复id 列的问题。但我进一步只是在考虑是否有一种方法,我们不会像 plan(B) 中那样明确选择每个列名。
    • SELECT * 不受欢迎,因为有一天您可能会添加一列,从而弄乱输出。如果省略 INSERT 的列列表,情况可能会更糟。
    • 谢谢你。如果可能的话,您能否帮助了解一些关于 AWS 的小知识?是否可以在 AWS RDS 处理程序中传递多个 SQL 语句?
    猜你喜欢
    • 1970-01-01
    • 2018-02-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多