【问题标题】:SQL querying through a many to many relationship通过多对多关系进行 SQL 查询
【发布时间】:2021-09-08 08:43:42
【问题描述】:

我有一个多对多 relationship 由三个表表示:quotepaymentquote_payment,因为一个报价可以有多次付款尝试,而一次付款可以用于多个报价。我的目标是进行查询,以返回所有已付款或未付款的报价。

因此,如果报价至少有一次付款,其中 is_paid = true 它应该在我的已付款报价查询中显示一次,如果没有,它应该在我尝试获取时显示尚未支付的报价。

目前,我有这个用于显示已支付报价的查询:

select distinct quote.name, payment.is_paid from quote
join quote_payment on (quote.id = quote_payment.quote_id)
join payment on (payment.id = quote_payment.payment_id)
where payment.is_paid is true;

对于那些尚未付款的人:

select distinct quote.name, payment.is_paid from quote
join quote_payment on (quote.id = quote_payment.quote_id)
join payment on (payment.id = quote_payment.payment_id)
where payment.is_paid is false;

问题是当我尝试获取尚未支付的报价时。例如,如果报价有一笔付款失败而另一笔付款成功,则它不应显示在未付款报价的查询中。

我还尝试将 is_paid 列放入 quote,而不是 payment,但这需要我在付款成功时更新与付款相关的所有报价,但也许这就是我应该做的正在做。考虑到这种模式,您将如何继续获取没有成功付款的报价?

Here's the schema with example data and some attempts I've made.

【问题讨论】:

  • 通常不是根据发票付款吗?

标签: mysql sql join select many-to-many


【解决方案1】:

使用聚合。每次付款都返回一个标志:

select q.name, max(p.is_paid) as is_paid
from quote q join
     quote_payment qp
     on q.id = qp.quote_id join
     payment p
     on p.id = qp.payment_id
group by q.name;

要过滤,请使用having 子句。 . .例如having max(p.is_paid) = 0

【讨论】:

    猜你喜欢
    • 2011-10-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-20
    相关资源
    最近更新 更多