Нужна помощь в объединении двух таблиц SQL, когда одна содержит идентификаторы, а вторая содержит имена, связанные с этим идентификатором - PullRequest
0 голосов
/ 18 апреля 2019

У меня есть 2 таблицы в MySQL. Один имеет транзакции с важными столбцами, где каждая строка имеет идентификатор дебетового счета и идентификатор кредитного счета. У меня есть вторая таблица, которая содержит имя учетной записи и специальный номер, связанный с идентификатором учетной записи. Я хочу как-то попробовать SQL-запрос, который будет принимать данные из таблицы транзакций и назначать имя учетной записи и номер счета из второй таблицы.

Я пытался делать все, используя два запроса, один получал транзакции, а второй получал данные учетной записи, а затем я перебирал данные в фрейме и назначал все по одному, что не очень хорошая идея

    query = "SELECT  tr_id, tr_date, description, dr_acc, cr_acc, amount, currency, currency_rate, document, comment FROM transactions WHERE " \
            "company_id = {} {} and deleted = 0 {} LIMIT {}, {}".format(
        company_id, filter, sort, sn, en)

    df = ncon.getDF(query)

    df.insert(4, 'dr_name', '')
    df.insert(6, 'cr_name', '')

    data = tuple(list(set(df['dr_acc'].values.tolist() + df['cr_acc'].values.tolist())))

    query = "SELECT account_number, acc_id, account_name FROM tb_accounts WHERE company_id = {} and deleted = 0 and acc_id in {}".format(
        company_id, data)

    df_accs = ncon.getDF(query)

    for index, row in df_accs.iterrows():
        acc = str(row['acc_id'])
        ac = row['account_number']
        nm = row['account_name']

        indx = df.index[df['dr_acc'] == acc].tolist()
        df.at[indx, 'dr_acc'] = ac
        df.at[indx, 'dr_name'] = nm

        indx = df.index[df['cr_acc'] == acc].tolist()
        df.at[indx, 'cr_acc'] = ac
        df.at[indx, 'cr_name'] = nm

Ответы [ 2 ]

0 голосов
/ 18 апреля 2019

Я думаю, вы ищете оператор SQL JOIN .

Принятие решения при написании запроса, который может работать на основе вашего кода:

    query = '''
SELECT transactions.tr_id,
       transactions.tr_date, 
       transactions.description, 
       transactions.dr_acc,
       transactions.cr_acc,
       transactions.amount,
       transactions.currency,
       transactions.currency_rate,
       transactions.document,
       transactions.comment
FROM transactions INNER JOIN tb_accounts ON tb_accounts.acc_id = transactions.acc_id
WHERE 
        transactions.company_id = {} AND
        tb_accounts.company_id = {} AND
        transactions.deleted = 0 AND
        tb_accounts.deleted = 0
ORDER BY transactions.tr_id
LIMIT 10;'''

Приведенный выше запрос будет примерно представлять результаты запроса со всеми полями, перечисленными в двух таблицах для каждой пары строк, в которых acc_id одинаков.

ПРИМЕЧАНИЕ. Возможно, приведенный выше запрос не будет иметь очень хорошую производительность. Операторы SQL JOIN должны быть написаны с осторожностью, но я написал их выше так, чтобы их было легко понять, чтобы проиллюстрировать мощь JOIN.

Вы по привычке НИКОГДА не должны пытаться что-то программировать, когда вместо этого можно использовать соединение. Если вы позаботитесь о том, чтобы правильно написал объединение, чтобы оно могло быть эффективным , движок MySQL будет превосходить ваш код Python по производительности почти каждый раз.

0 голосов
/ 18 апреля 2019

сортировка двух фреймов данных и использование слияния для объединения фрейма 2data

df1 = df1.sort_values(['dr_acc'], ascending=True)
df2 = df2.sort_values(['acc_id'], ascending=True)

 merge2df = pd.merge(df1, df2, how='outer',
                     left_on=['dr_acc'], right_on=['acc_id'])

Я предположил, что df1 - это первый набор данных запроса, а df2 - второй набор данных запроса

sql query

   '''SELECT  tr_id, tr_date, 
    description, 
    dr_acc, cr_acc,
    amount, currency,
    currency_rate, 
    document,
   account_number, acc_id, account_name
     comment FROM transactions left join
     tb_accounts on transactions.dr_acc=tb_accounts.account_number'''
...