2014-01-22 51 views
0

我有以下的數據庫表(簡體)內聯接返回正確MAX日期,但沒有等領域,在同一行

statistics_meter 

id | mpan_number 
1 | 12345678 
2 | 87654321 

statistics_contract 
id | contract_end_date | meter_id | supplier 
1 | 2014-01-10   | 1   | British gas 
2 | 2013-12-01   | 1   | Southern Electric 
3 | 2014-03-01   | 2   | EON 

我的查詢是爲了獲取最新的合同結束日期爲給定的儀表和回報它與供應商一起。我已經寫了查詢並返回了正確的合同結束日期,但是供應商正在從先前的合同返回 - 因此返回來自兩行的數據,而不僅僅是一行。

例如我得到

2014-01-10|Southern Electric 

..不正確。

我的查詢:

SELECT 
    statistics_meter.mpan_number AS mpanNumber, 
    MAX(statistics_contract.contract_end_date) AS contractEndDate, 
    statistics_contract.supplier AS supplierName 
FROM statistics_contract 
    INNER JOIN statistics_meter 
     ON statistics_meter.id=statistics_contract.meter_id 
GROUP BY statistics_contract.meter_id 

預先感謝幫助

+0

那就是當你不明白數據庫是如何工作的會發生什麼。閱讀文檔(http://dev.mysql.com/doc/refman/5.7/en/group-by-extensions.html)中關於MySQL'group by'擴展的信息。不在「group by」中的列的值是任意的。 –

+1

對子查詢過濾器使用JOIN。 – Mihai

+0

我欣賞鏈接@GordonLinoff,但你不同意,如果大家都知道里面的文檔將不需要stackoverflow? – anewvision

回答

1

您可以使用此SQL查詢

SELECT 
    statistics_meter.mpan_number AS mpanNumber, 
    s.contract_end_date AS contractEndDate, 
    s.supplier AS supplierName 
FROM statistics_contract AS s 
    INNER JOIN statistics_meter 
     ON statistics_meter.id=s.meter_id 
WHERE s.contract_end_date = (
    SELECT MAX(contract_end_date) 
    FROM statistics_contract AS sc 
    WHERE sc.meter_id=s.meter_id 
) 
+0

謝謝,這個工作。 – anewvision

1

它不能在同一行中返回等領域,因爲沒有同一行。聚合的概念是根據行數生成任意值的單個值。如果表中有1200行滿足查詢中表示的其他條件,那麼對於任何「其他」字段,您希望查詢返回哪個可能的1200個其他不同值。

要從其中一行獲取其他數據,您必須指定所需的特定行。

SELECT m.mpan_number mpanNumber, 
    c.contract_end_date, c.supplier supplierName 
FROM statistics_contract c 
    JOIN statistics_meter m 
    ON m.id=c.meter_id 
where contract_end_date = 
     (Select Max(contract_end_date) 
     From statistics_contract 
     Where meter_id = c.meter_id) 

......即使這樣,如果在statistics_contract多行具有相同meter_id和去年contract_end_date可能無法正常工作。

+0

謝謝,合同結束日期總是唯一的 – anewvision

相關問題