mysql:按2列查询最大日期组错误结果
我的数据库中有这个表 **示例数据**** (表名=章节内容) 我想为每个statecode列和policyname列查找max datepublished 与此类似,结果应该只有一条记录,即每个国家/地区/政策的最大发布日期 因此,一个国家应该有3项政策记录(WEEE/电池/包装),如 我使用的mysql代码是mysql:按2列查询最大日期组错误结果,mysql,Mysql,我的数据库中有这个表 **示例数据**** (表名=章节内容) 我想为每个statecode列和policyname列查找max datepublished 与此类似,结果应该只有一条记录,即每个国家/地区/政策的最大发布日期 因此,一个国家应该有3项政策记录(WEEE/电池/包装),如 我使用的mysql代码是 SELECT t.section_name, t.report_text, t.countryname, t.policyname,
SELECT t.section_name,
t.report_text,
t.countryname,
t.policyname,
t.statecode,
t.datepublished,
date_format(t.dateupdated,"%Y-%m-%d")as dateupdated
FROM sections_content t
INNER JOIN (
select max(datepublished) as Maxdate,statecode,policyname
from sections_content
group by statecode,policyname
) tm
ON t.datepublished= tm.Maxdate and t.statecode = tm.statecode and t.policyname=tm.policyname
WHERE t.section_name="Executive Summary"
但结果是错误的,一些国家没有选择所有的政策
例如南非国家只挑选电池和包装,但缺少WEEE(但数据库中有南非的WEEE)
所以我想请任何人检查我的代码有什么问题。
感谢您的帮助。问题在于,对于一个简单的问题,您的查询太复杂了,您已经在查询中找到了答案: 就这样试试吧:
SELECT policyname,
statecode,
max(datepublished)
FROM sections_content
WHERE section_name="Executive Summary"
group by statecode,policyname
我觉得不错。See report_text不是提供的数据集中的一列。南非不是提供的数据集中的一个值。@上面的草莓表只是示例数据,但实际数据允许,我们只能对实际提供的信息进行评论。@草莓好的,我已经编辑过了,但表中有上百个国家,我无法提供所有信息。无论如何,谢谢你的帮助。我看不出重印OP的子查询有什么好处。也许仅仅因为它是正确的查询,没有必要对一个简单的问题做出复杂的回答。OP希望返回表中所有相关的列。@curiousp如果这回答了问题,那么这个问题就很容易误导人@草莓嘿,我真的很感激你的帮助,如果我让你误会了,我很抱歉。这是我的错,不要生气。求你了,我对你的回答投了赞成票,因为你乐于助人。
SELECT t.section_name,
t.report_text,
t.countryname,
t.policyname,
t.statecode,
t.datepublished,
date_format(t.dateupdated,"%Y-%m-%d")as dateupdated
FROM sections_content t
INNER JOIN (
select max(datepublished) as Maxdate,statecode,policyname
from sections_content
group by statecode,policyname
) tm
ON t.datepublished= tm.Maxdate and t.statecode = tm.statecode and t.policyname=tm.policyname
WHERE t.section_name="Executive Summary"
SELECT policyname,
statecode,
max(datepublished)
FROM sections_content
WHERE section_name="Executive Summary"
group by statecode,policyname
DROP TABLE IF EXISTS sections_content;
CREATE TABLE sections_content
(Section_name VARCHAR(30) NOT NULL
,countryname VARCHAR(30) NOT NULL
,policyname VARCHAR(30) NOT NULL
,statecode CHAR(2) NOT NULL
,datepublished DATE NOT NULL
,dateupdated DATE NULL
,PRIMARY KEY(countryname,policyname,statecode,datepublished) -- assumed PK
);
INSERT INTO sections_content VALUES
('Executive Summary','Algeria','WEEE','DZ','2016-05-11','2017-02-16'),
('Executive Summary','Algeria','WEEE','DZ','2017-02-15','2017-02-16'),
('Executive Summary','Algeria','Batteries','DZ','2017-02-15','2017-02-16'),
('Executive Summary','Algeria','Packaging','DZ','2017-02-15','2017-02-16'),
('Executive Summary','South Africa','Packaging','DZ','2017-02-15','2017-02-16');
SELECT t.*
FROM sections_content t
JOIN
( SELECT MAX(datepublished) Maxdate
, statecode
, policyname
, countryname
FROM sections_content
GROUP
BY statecode
, policyname
, countryname
) tm
ON t.datepublished = tm.Maxdate
AND t.statecode = tm.statecode
AND t.policyname = tm.policyname
AND t.countryname = tm.countryname
WHERE t.section_name = "Executive Summary";
+-------------------+--------------+------------+-----------+---------------+-------------+
| Section_name | countryname | policyname | statecode | datepublished | dateupdated |
+-------------------+--------------+------------+-----------+---------------+-------------+
| Executive Summary | Algeria | Batteries | DZ | 2017-02-15 | 2017-02-16 |
| Executive Summary | Algeria | Packaging | DZ | 2017-02-15 | 2017-02-16 |
| Executive Summary | South Africa | Packaging | DZ | 2017-02-15 | 2017-02-16 |
| Executive Summary | Algeria | WEEE | DZ | 2017-02-15 | 2017-02-16 |
+-------------------+--------------+------------+-----------+---------------+-------------+