【问题标题】:how to connect two different table having similar foreign key?如何连接两个具有相似外键的不同表?
【发布时间】:2021-06-08 03:48:07
【问题描述】:

我正在使用 laravel 和 mysql 创建一个会计模块。为此,我有一个名为“票据”的主表,其中有一些关于发票信息的列,id 作为主键。现在我有两个不同的表,名为“payments”,具有bill_id 作为外键,“debitnotes”也具有bill_id 作为外键。

现在我想显示已支付的特定账单的支付历史。为此,我必须立即根据账单 ID 从付款表和借记表中检索信息!现在,我的问题是:如何在不编写多个查询的情况下实现这一目标?

bills 表有列:

id bill_number vendor_id amount amount_payable date

payments 表有列:

id bill_id transaction_number amount date vendor_id

debitnotes 表有列:

id bill_id debit_note_number amount vendor_id date

我想在单页中显示特定账单的付款和借记单。我怎样才能做到这一点?

【问题讨论】:

  • 通过 SQL 连接概念,您可以通过连接表及其关系来实现这一点。
  • 你能显示一些表模式吗?
  • @Bohemian 先生,我已经用表格详细信息更新了我的问题。请调查一下。新手请多包涵,编辑不当见谅
  • 3 个表格中的vendor_id 是否包含给定账单的相同值?如果不是,请解释每一列的含义。
  • @Bohemian 是的先生,我忘记添加供应商表,其中包含供应商的所有详细信息。三个表中的值都相同。

标签: mysql laravel


【解决方案1】:

使用union

select
  'bill' source,
  id,
  bill_number number,
  vendor_id,
  amount,
  amount_payable,
  date
from bills
union all
  'payment',
  id,
  transaction_number,
  vendor_id,
  -amount amount, -- assuming payments cause the balance to lower
  null,
  date
from payments
union all
  'debitnote',
  id,
  debit_note_number,
  vendor_id,
  amount,
  null,
  date
from debitnotes

您应该从paymentsdebitnotes 中删除vendor_id 列,因为它是多余的(或非规范化);可以通过加入bill 表找到它。

【讨论】:

  • 成功了,先生!但是我应该怎么做才能为两个表显示不同的列?假设可以通过在线、支票或现金支付,所以它应该显示这些模式中的任何一种,而借记单没有这些,所以它应该显示借记单编号!即使在借记单列中也显示已支付的支票!如何区分这两列?
  • 可以,但是payments的哪一栏是支付方式?
  • 我在付款表中添加了名为 payment_mode 的新列来确定付款方式...
  • 在联合的每个查询中添加一个选中的列,从其他表中选择null,并在第一个选择中将其命名为payment_type。即select ..., null payment_type union ...
  • 谢谢您,先生。我接受了你的回答作为这个问题的最终答案。你的建议对我帮助很大!现在请承受我的最后一个问题! :) 我怎样才能为不同的表格显示不同的 html 表格标题?比如如果值来自“付款”表,那么 html 表头应该是 bill_number、供应商名称、金额、付款方式、横断面编号等,如果它来自借方表,那么 html 表头应该是 bill_number、供应商名称、金额,借记单号码等....问题是如何在不添加标志的情况下区分它们?
【解决方案2】:

您应该使用联接子句,对于付款和借记单,您可以在表名前添加。

这是来自documentation的示例:

$users = DB::table('users')
        ->join('contacts', 'users.id', '=', 'contacts.user_id')
        ->join('orders', 'users.id', '=', 'orders.user_id')
        ->select('users.*', 'contacts.phone', 'orders.price')
        ->get();

【讨论】:

    猜你喜欢
    • 2020-11-26
    • 1970-01-01
    • 1970-01-01
    • 2015-02-13
    • 1970-01-01
    • 2014-07-17
    • 1970-01-01
    • 2021-10-25
    • 2019-10-27
    相关资源
    最近更新 更多