2 votes

AWS Aurora DB combine des données provenant de plusieurs instructions SQL

J'ai trois tables avec des schémas de données, comme par exemple :

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

Les données de tous les utilisateurs ( tableau des utilisateurs ) est simplement récupéré à l'aide de la fonction de traitement lambda de la manière suivante :

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

Si l'on procède de la même manière pour un autre tableau summary ou actions , cela fonctionne aussi. Je dois maintenant combiner toutes les colonnes de ces trois tables et renvoyer les données (les lignes renvoyées doivent correspondre sur la base des critères suivants req_id ). Mon extrait de travail : https://dbfiddle.uk/?rdbms=mysql_5.7&fiddle=016ecc94c792611fbaca810605e81a6a

Mais le résultat final obtenu contient la colonne user_id sous forme dupliquée, c'est-à-dire trois fois l'inclusion. Je n'ai pas besoin que la même colonne soit répétée trois fois.

Je suis un peu novice dans la manipulation des requêtes MySQL, et je n'arrive donc pas à comprendre la raison exacte de l'erreur, même si la table existe. La version de MySQL utilisée dans Aurora est la 5.7.

Toute aide pour résoudre ce problème est la bienvenue !

3voto

Deepak Points 1754

Essayez ceci

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

OU

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

2voto

Rick James Points 15994

Plan A : Spécifiez explicitement les colonnes que vous souhaitez. Avantage supplémentaire : vous pouvez vous débarrasser des identifiants, qui ont tendance à être inutiles pour les autres personnes qui lisent la sortie.

Plan B : (Cette option n'est pas toujours possible.) Au lieu de JOIN .. ON t1.a = t2.a dire JOIN .. USING(a)

J'aime utiliser des pseudonymes courts. Ici, on fait tout ensemble :

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)

En général, il n'est pas judicieux d'avoir une relation 1:1 (comme vous l'avez fait par l'intermédiaire de user_id ) ; vous pourriez tout aussi bien avoir toutes les colonnes dans un seul tableau.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X