python - 当一个包含 id 而第二个包含与该 id 关联的名称时,需要帮助合并两个 SQL 表

标签 python mysql python-3.x

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

相关文章:

python - Python3 中的条件合并

python - 使用 Python 获取视频属性而不调用外部软件

python - 在 numpy 数组中 reshape 和连接

mysql - 我应该牺牲我的 innodb_buffer_pool_size/RAM 来为 query_cache_size 腾出空间吗?

mysql - 如何从具有多个匹配值的 JOIN 的表中进行 SELECT?

python - 如何通过应用函数交换两列中的值?

python - Numpy:部分转置和堆栈

mysql - 检查 MySQL 中行是否存在的最佳方法是什么

Python 3 - 在单个 .py 文件中访问多个词典

python - 正则表达式匹配引号括起来的字符串文字而不匹配其他字符串