问题描述
我有三个带有数据模式的表,例如:
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);
}
};
如果另一个表summary
或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
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
一样);您也可以将所有列都放在一个表中。