簡體   English   中英

AWS Aurora 數據庫合並來自多個 SQL 語句的數據

[英]AWS Aurora DB Combine Data from Multiple SQL Statements

我有三個帶有數據模式的表,例如:

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進行相同的actions ,它也可以工作。 現在,我需要組合這三個表的所有列,然后返回數據(返回的行應根據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

或者

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 ); 您也可以將所有列都放在一個表中。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM