mysql使用一对多、多对一关系连接,没有冗余数据

mysql使用一对多、多对一关系连接,没有冗余数据,mysql,join,relational-database,Mysql,Join,Relational Database,我只是在谷歌上搜索了一下,但找不到任何完美的答案来回答我的问题。我正在尝试连接三个表:订单、付款、里程碑、发票。表之间的关系如下: 订单到付款里程碑(一对多)一个订单可以有多个与之相关的付款里程碑,可能在不同日期为25%、50%和25% 现在,在到达付款里程碑时间后,将生成发票,并且在发票表中,将有订单id和付款里程碑id 所以,当我像这样加入他们时: SELECT inv.invoice_id, ord.sub_total, ord.vat_added, pm.pay_date, pm.pe

我只是在谷歌上搜索了一下,但找不到任何完美的答案来回答我的问题。我正在尝试连接三个表:订单、付款、里程碑、发票。表之间的关系如下:

订单到付款里程碑(一对多)一个订单可以有多个与之相关的付款里程碑,可能在不同日期为25%、50%和25%

现在,在到达付款里程碑时间后,将生成发票,并且在发票表中,将有订单id和付款里程碑id

所以,当我像这样加入他们时:

SELECT 
inv.invoice_id, ord.sub_total, ord.vat_added, pm.pay_date, pm.percentage
FROM orders ord
INNER JOIN
payment_milestone pm ON ord.order_id = pm.order_id 
INNER JOIN 
invoices inv ON ord.order_id = inv.order_id
它让我想起: 这是多余的

我使用了
groupby
子句,它产生了以下结果:

我想要的结果是:

invoice_id      sub_total        vat_added        pay_date       percentage
----------------------------------------------------------------------------
11              40000.00         2000.00          2018-09-20     53
12              40000.00         2000.00          2018-09-22     47
13              45360.00         2268.00          2018-09-27     100
我不知道我在查询中哪里做错了


提前谢谢

如果在付款里程碑和发票表之间联接,则联接应在
付款里程碑id
上,而不是
订单id
上。据我所知,根据您有限的问题陈述,对于每个
付款里程碑\u id
,都会生成一个
发票\u id

请尝试以下操作:

SELECT 
  inv.invoice_id, 
  ord.sub_total, 
  ord.vat_added, 
  pm.pay_date, 
  pm.percentage
FROM orders AS ord
INNER JOIN
  payment_milestone AS pm ON ord.order_id = pm.order_id 
INNER JOIN 
  invoices AS inv ON pm.payment_milestone_id = inv.payment_milestone_id

这是条款吗necessary@MahmoodHussain很乐意帮忙:)
AS
子句不是必需的,但它有助于更清晰地阅读查询,这就是我喜欢使用它的原因