簡體   English   中英

MySQL - 使用連接查詢來自 3 個不同表的 select 數據

[英]MySQL - Query to select data from 3 different tables using joins

我的 MySQL 數據庫中有 3 個表(合同、合同詳細信息、合同接收)。 表結構如下:

Contract
c_id     |   c_date   |  c_vendor  |  c_ref
---------+------------+------------+--------
   1     |  2/27/2020 | MS Traders |  n/a
   2     |  2/28/2020 | MS Traders |  n/a
   3     |  2/29/2020 | J Premiers |  n/a


Contract_Details
cc_id    | cd_contract_id | cd_item       | cd_qty | cd_rate | cd_total
---------+----------------+---------------+--------+---------+---------
    1    |        1       | HP Laptop     |    3   |  5300   |   15900
    2    |        1       | Dell Laptop   |    5   |  5700   |   28500
    3    |        2       | HP Printer    |    8   |  2500   |   20000
    4    |        3       | Epson Printer |    5   |  3500   |   17500
    5    |        3       | IB Scanner    |    5   |  4200   |   21000

Contract_Receiving
cr_id    | cr_cd_id  |  cr_date    |  cr_qty
---------+-----------+-------------+---------
    1    |     1     |  3/1/2020   |    3
    2    |     2     |  3/1/2020   |    5
    3    |     3     |  3/3/2020   |    2
    4    |     3     |  3/8/2020   |    2

我想從三個表中得到以下結果:

c_id   |  c_vendor  | items_received | items_total
-------+------------+----------------+-------------
   1   | MS Traders |      8         |       8
   2   | MS Traders |      4         |       8
   3   | J Premiers |      0         |      10

我正在使用以下查詢,但沒有得到想要的結果。 請指導我編寫查詢以獲得所需的結果。 謝謝

SELECT contract.*, IFNULL(SUM(cr_qty),0) AS 'Received', SUM(contract_detail.cd_qty) AS 'Total' 
FROM `contract_receiving`
LEFT JOIN contract_detail ON (contract_receiving.cr_cd_id = contract_detail.cd_id)
LEFT JOIN contract ON (contract.c_id = contract_detail.cd_contract_id)
GROUP BY contract.c_id

您可以通過在加入前計算 items_received 和 items_total 來獲得預期的結果。

SELECT
  c.c_id,
  c.c_vendor,
  COALESCE(cr.items_received, 0) items_received,
  COALESCE(cd.items_total, 0) items_total
FROM contract c
LEFT JOIN
( SELECT cd_contract_id, SUM(cd_qty) items_total
  FROM contract_detail
  GROUP BY cd_contract_id) cd
ON c.c_id=cd.cd_contract_id
LEFT JOIN
( SELECT cd_contract_id, SUM(cr_qty) items_received
  FROM contract_receiving
  INNER JOIN contract_detail
  ON cd_id=cr_cd_id
  GROUP BY cd_contract_id) cr
ON c.c_id=cr.cd_contract_id

DB小提琴

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM