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,
        label VARCHAR(50) NOT NULL,
        access_count INT NOT NULL,
        median  FLOAT(10)
    );

Данные для всех пользователей (таблица пользователей) просто извлекаются с помощью функции обработчика лямбда следующим образом:

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=016ecc94a616a<81011fbaca81011fbaca /а>

Но полученный окончательный результат содержит столбец user_id в дублированном виде, т.е. трехкратное включение. Мне не нужно, чтобы один и тот же столбец повторялся трижды.

Я немного новичок в обработке запросов MySQL, поэтому не могу понять точную причину ошибки, даже если таблица существует. Версия MYSQL, используемая в Aurora, — 5.7.

Любая помощь, чтобы решить то же самое, приветствуется!


person bubble-cord    schedule 09.11.2020    source источник


Ответы (2)


План А. Явно укажите нужные столбцы. Дополнительное преимущество: вы можете избавиться от идентификаторов, которые, как правило, бесполезны для других, читающих вывод.

План Б: (Этот вариант возможен не всегда.) Вместо 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); вы также можете иметь все столбцы в одной таблице.

person Rick James    schedule 12.11.2020
comment
На самом деле я не хочу явно выбирать имена столбцов по одному. Потому что в реальном случае все три и более таблиц будут содержать более 4-5 столбцов. Подбирать все имена столбцов по отдельности будет неуклюже. Итак, есть ли способ сделать select * from t1, t2, t3.... и так далее? - person bubble-cord; 12.11.2020
comment
План Б — USING(id) делает именно то, о чем вы просили — избегает повторного показа id. - person Rick James; 12.11.2020
comment
Да, ваш ответ полностью уместен и решает проблему повторяющегося столбца id. Но я также просто думал о возможности, если есть способ, которым мы не выбираем имя каждого столбца явно, как это сделано в плане (B). - person bubble-cord; 12.11.2020
comment
SELECT * не одобряется, потому что когда-нибудь вы можете добавить столбец, тем самым испортив вывод. Может быть еще хуже, если оставить список столбцов для INSERT. - person Rick James; 12.11.2020
comment
Спасибо за то же. Если возможно, не могли бы вы помочь узнать кое-что об AWS? Можно ли передать несколько операторов SQL в обработчик AWS RDS? - person bubble-cord; 13.11.2020
comment
@bubble-cord - Возможно это или нет, не делайте этого. - person Rick James; 13.11.2020
comment
Из-за осложнений в результатах запросов? Или же? - person bubble-cord; 13.11.2020

попробуй это

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 
person Deepak Singhal    schedule 09.11.2020
comment
забыл пометить код как фрагмент кода, так как звездочки не отображались. Еще будет работать SELECT * from users,summary WHERE users.user_id=summary.user_id - person Deepak Singhal; 12.11.2020