Mysql 内部联接返回正确的最大日期,但不返回同一行中的其他字段
我有以下db表(简化) 我的查询旨在获取给定仪表的最新合同结束日期,并将其与供应商一起返回。我已经编写了查询并返回了正确的合同结束日期,但供应商从上一份合同返回,因此返回的数据是两行,而不是一行 e、 我明白了Mysql 内部联接返回正确的最大日期,但不返回同一行中的其他字段,mysql,sql,join,max,Mysql,Sql,Join,Max,我有以下db表(简化) 我的查询旨在获取给定仪表的最新合同结束日期,并将其与供应商一起返回。我已经编写了查询并返回了正确的合同结束日期,但供应商从上一份合同返回,因此返回的数据是两行,而不是一行 e、 我明白了 2014-01-10|Southern Electric 。。不对 我的问题是: SELECT statistics_meter.mpan_number AS mpanNumber, MAX(statistics_contract.contract_end_date)
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
提前感谢您的帮助它不能返回同一行中的其他字段,因为同一行中没有。聚合的概念是从任意行数的值生成单个值。如果表中有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)
。。。如果在
统计数据\u合同
中有多行具有相同的仪表id
和最后一个合同结束日期
,则即使这样也可能不起作用 您可以使用此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
)
当您不了解数据库如何工作时,就会发生这种情况。阅读文档()中的MySQL
groupby
extensions。group by
中未包含的列的值是任意的。请使用带有子查询筛选器的联接。我很欣赏@GordonLinoff链接,但您是否同意,如果每个人都知道文档的内容,就不需要stackoverflow?@newvision。MySQL的扩展列特性是非标准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
)