簡體   English   中英

MySQL在同一列上兩次將同一表連接在一起,但值不同,僅返回最新行

[英]MySQL join same table twice on same column with different value returning most recent row only

我被困於嘗試解決否則是復雜的JOIN的一小部分。

我們有一個“指令”表和一個“估計”表。 在“估計”中,對於給定指令,我們有多行用於不同類型的estimates

說明表

id | address | status
1 | 27 TAYLOR ROAD, ALBION PARK NSW 2527 | InProgress

估算表

id | instruction_id | basis | basis_date | basis_value
1 | 1 | ContractPrice | 2012-04-05 | 124000
2 | 1 | CAMV | 2012-02-01 | 120000
3 | 1 | CustomerEstimate | 2012-06-07 | 132000
4 | 1 | ContractPrice | 2013-01-03 | 140000
5 | 1 | CustomerEstimate | 2013-02-09 | 145000

我們想要的實際上是基於structions.id = Estimates.instruction_id和estimate.basis的“ estimates”上的“ instructions”的2個聯接,用於1)最新的“ CustomerEstimate”(別名為basic_date和basic_value的estimate_date和estimate_value)和2)最近的“合同價格”(再次,將base_date和base_value別名為contact_date和contract_value)。

預期結果如下:

id | address | status | contract_price | contract_date | estimate_date | estimate_value
1 | 27 TAYLOR ROAD, ALBION PARK NSW 2527 | InProgress | 2013-01-03 | 140000 | 2013-02-09 | 145000

我真的很感謝來自SQL專家的幫助。

非常感謝,特倫特。

嘗試

SELECT i.id,  
       i.address, 
       i.status,
       p.max_date contract_date, 
       p.basis_value contract_price, 
       e.max_date estimate_date, 
       e.basis_value estimate_value
  FROM Instructions i LEFT JOIN
(
    SELECT q1.instruction_id, max_date, basis_value
      FROM Estimates e JOIN
    (
        SELECT instruction_id, MAX(basis_date) max_date
          FROM Estimates
         WHERE basis = 'CustomerEstimate'
         GROUP BY instruction_id
    ) q1 ON e.instruction_id = q1.instruction_id AND e.basis_date = q1.max_date
) e ON i.id = e.instruction_id LEFT JOIN
(
    SELECT q2.instruction_id, max_date, basis_value
      FROM Estimates e JOIN
    (
        SELECT instruction_id, MAX(basis_date) max_date
          FROM Estimates
         WHERE basis = 'ContractPrice'
         GROUP BY instruction_id
    ) q2 ON e.instruction_id = q2.instruction_id AND e.basis_date = q2.max_date
) p ON i.id = p.instruction_id

輸出:

| ID |                              ADDRESS |     STATUS | CONTRACT_PRICE | CONTRACT_DATE | ESTIMATE_VALUE | ESTIMATE_DATE |
----------------------------------------------------------------------------------------------------------------------------
|  1 | 27 TAYLOR ROAD, ALBION PARK NSW 2527 | InProgress |         140000 |    2013-01-03 |         145000 |    2013-02-09 |

這是SQLFiddle演示。

這里的合同價格是多少? 您可以嘗試以下

select inst.id
     , inst.address
     , inst.status
     , est.basis_value as estimate_value
     , est.basis_date as estimate_date 
  from instructions inst
     , estimates est 
 where inst.id=est.instruction_id 
   and (est.basis='CustomerEstimate' or est.basis='ContractPrice') 
 order 
    by est.basis
     , est.basis_date desc;

暫無
暫無

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

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