我在 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/