我在MySQL中有2个表。
一个交易的重要列,每行都有借方帐户ID和贷方帐户ID。我有第二个表,其中包含帐户名和与帐户ID相关的特殊编号。我想以某种方式尝试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
最佳答案
我想您正在寻找的是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的功能。
作为一种习惯,您应该在可以使用连接时尝试进行编程。只要您注意write a join properly so that it can be efficient,MySQL引擎几乎每次都会击败python代码以提高性能。
关于python - 当其中一个包含ID,第二个包含与该ID相关的名称时,需要帮助合并两个SQL表,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/55750653/