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

AWS Aurora DB Combine Data from Multiple SQL Statements

我有三个 table 具有数据模式,例如:

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)
    );

所有用户(用户 table)的数据使用 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);
  }
};

如果另一个table summaryactions 也遵循同样的方法,它也有效。现在,我需要合并这三个 table 的所有列,然后合并 return 数据(returned 行应该在 req_id 的基础上匹配)。 我的工作片段:https://dbfiddle.uk/?rdbms=mysql_5.7&fiddle=016ecc94c792611fbaca810605e81a6a

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

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

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

试试这个

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

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

方案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);您也可以将所有列都放在一个 table.