Mysql 组合两个SQL查询,从一列中获取不同的值,从第二列中获取最大值
我有下表:Mysql 组合两个SQL查询,从一列中获取不同的值,从第二列中获取最大值,mysql,sql,Mysql,Sql,我有下表: Country Year 100 201313 100 201212 101 201314 101 201213 101 201112 102 201313 102 201212 103 201313 103 201212 104 201313 104 201212 我需要一个只提供一个国家和一年中最大值的查询,例如: Country Year 100 201313 101 201314 102 201313 103 201313 104 201313 到目前为止,我的解决方案是
Country Year
100 201313
100 201212
101 201314
101 201213
101 201112
102 201313
102 201212
103 201313
103 201212
104 201313
104 201212
我需要一个只提供一个国家和一年中最大值的查询,例如:
Country Year
100 201313
101 201314
102 201313
103 201313
104 201313
到目前为止,我的解决方案是先查询不同的国家,然后过一会儿再查询年份
$resOne = $mysqli->query("SELECT DISTINCT Country from Table ORDER BY Country ASC");
while ($obj = $resOne->fetch_object()){
$resTwo = $mysqli->query("SELECT Country, Year from Table WHERE Country = $resOne->Country ORDER BY Country ASC LIMIT 1")->fetch_object();
echo $resTwo->Country $resTwo->Year;
}
问题:是否有可能仅通过一个查询就提供此结果
谢谢你的阅读和回答
更新
来自user2989408和Drew的答案上的脚本是好的,并且工作正常,但是当我加入另一个表时,我没有得到正确的数据
下面是我的DB示例和脚本:
如何使描述行显示MAX(s.Year)的描述?例如,小提琴的第一行应该显示“法国最新201314”。您的查询应该是
SELECT t.Country, MAX(t.Year)
FROM Table t
GROUP BY t.Country
ORDER BY t.Country ASC
编辑:在更新的需求之后,要选择其他信息,可以按如下方式修改查询以工作
SELECT c.Name, s.Description, s.Year
FROM
(
SELECT s.id as id, MAX(s.Year) as Max
FROM seasons s
GROUP BY s.Id
) as X
JOIN countries c ON c.Id = X.Id
JOIN seasons s ON s.id = X.id AND X.Max = s.Year
ORDER BY c.Name ASC
子查询也可用于选择所需信息,如下所示
SELECT c.Name,
(SELECT s1.Description
FROM seasons s1 WHERE s1.id = X.id AND X.Max = s1.Year) as Description,
X.Max as Year
FROM
(
SELECT s.id as id, MAX(s.Year) as Max
FROM seasons s
GROUP BY s.Id
) as X
JOIN countries c ON c.Id = X.Id
ORDER BY c.Name ASC
如果您了解groupby
的工作原理,基本上可以通过多种方式获取所需信息 查询:
SELECT Country,
Max(Year)
FROM Table
GROUP BY Country
结果:
| NAME | DESCRIPTION | YEAR |
|-------------|-------------|--------|
| France | newest | 201314 |
| Germany | new | 201212 |
| Italy | new | 201313 |
| Netherlands | newest | 201313 |
| Spain | new | 201313 |
首先我想问一下,你为什么要用这种方式存储你的一年?这是一个足球/足球网站。根据国家的不同,联赛可以从2013/14年开始,也可以仅从2013年开始,或者在同一年举行两次比赛。。。因此,201314=2013/14、201313=2013、201301=2013年第一季度和201302=2013年第二季度。在显示器上进行此类转换而不是解析这两个值不是更有效吗?在显示器上,我显示的是正确的字符串,例如“2013/14”而不是“201314”。问题是要做一个索引,在那里我显示所有国家和它们最近的联赛。例如,显示:西班牙联赛BBVA 2013/14
DISTINCT
不需要。您编写的脚本很好,工作正常,但当我将表与另一个表合并时,我没有获得正确的数据。查看如何使描述行显示MAX(s.Year)的描述?例如,fiddle中的第一行应显示“France New 201314”@Emmanuel。必须使用另一个JOIN
单独选择描述,如图所示或使用子查询。我猜你只想选择最近一季的国家名称和描述。
| NAME | DESCRIPTION | YEAR |
|-------------|-------------|--------|
| France | newest | 201314 |
| Germany | new | 201212 |
| Italy | new | 201313 |
| Netherlands | newest | 201313 |
| Spain | new | 201313 |