AWS Aurora DB合并来自多个SQL语句的数据

问题描述

我有三个带有数据模式的表,例如:

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,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进行匹配)。 我的工作摘要https://dbfiddle.uk/?rdbms=mysql_5.7&fiddle=016ecc94c792611fbaca810605e81a6a

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

我对处理MySQL查询有些陌生,因此即使表存在,也无法找出错误的确切原因。 aurora中使用的MysqL版本是5.7。

感谢您为解决该问题提供的任何帮助!

解决方法

尝试

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

OR

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

计划A:明确指定所需的列。额外的好处:您可以摆脱ids的使用,这些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一样);您也可以将所有列都放在一个表中。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...