【问题标题】:Need help to merge two sql tables when one contains ids and second contains names associated to that id当一个包含 id 而第二个包含与该 id 关联的名称时,需要帮助合并两个 sql 表
【发布时间】:2019-04-18 16:58:09
【问题描述】:

我在 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 表还是尝试对 account_number 进行查询,如果是,您的预期输出是什么以及您希望输出的格式是什么?
  • 我想输出账户信息。交易是在一张表中,我在两列中有帐户 ID,一是借方,一是贷方。在另一个表中,我有 ID、帐户名称、帐号并希望以某种方式加入输出,但我尝试过的查询(如 INNER JOIN)以某种方式给了我一堆错误

标签: python mysql python-3.x


【解决方案1】:

我认为您正在寻找的是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 代码。

【讨论】:

  • 太完美了,非常感谢,现在有了语法和逻辑的想法。
【解决方案2】:

对两个数据框进行排序并使用合并来合并两个数据框

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查询

   '''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'''

【讨论】:

  • 关于 df1 和 df2 是正确的,但是否可以在查询中做到这一点?
  • @SandroShubladze 是的,也可以在 sql 中使用
猜你喜欢
  • 1970-01-01
  • 2019-11-14
  • 2015-03-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-09
  • 2011-12-06
  • 1970-01-01
相关资源
最近更新 更多