内部联接返回正确的MAX日期,但不返回同一行中的其他字段

时间:2014-01-22 14:22:38

标签: mysql sql join 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

我的查询旨在获取给定仪表的最新合同结束日期,并将其与供应商一起退回。我已经编写了查询并返回正确的合同结束日期供应商正在从之前的合同返回 - 因此从两行中返回数据,而不仅仅是一行。

e.g。我得到

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

提前感谢您的帮助

2 个答案:

答案 0 :(得分: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,则可能无效。

答案 1 :(得分: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
)