我有以下数据库表(人员):
+--------+--------+--------+
| Name | Age | Time |
+--------+--------+--------+
| Tim | 30 | 10:10 |
| Jill | 31 | 10:20 |
| Peter | 31 | 10:30 |
| Peter | 33 | 10:40 |
| Jack | 32 | 10:50 |
| Susan | 35 | 10:60 |
| Susan | 35 | 11:70 |
+--------+--------+--------+
现在我想从这个列表中得到5个最老的名字:
Select * FROM People ORDER BY Age DESC LIMIT 5
这将给出:
| Susan | 35 | 11:70 |
| Susan | 35 | 10:60 |
| Peter | 33 | 10:40 |
| Jack | 32 | 10:50 |
| Peter | 31 | 10:30 |
现在这不是我想要的。我们看到苏珊在那里两次,和彼得一样。我不希望出现重复的名字。现在我们看到2个Susans的年龄相同,所以具有最高时间(mm:ss)
的Susan应该被过滤掉(在这种情况下:| Susan | 35 | 11:70 |
)
Fot 2 Peters我们看到一个彼得年纪大了,所以在这种情况下,年轻的彼得应该被过滤掉(| Peter | 31 | 10:30 |
)
那么这个查询怎么样?它应首先选择all,然后按Age(最旧的顶部)对它们进行排序,然后筛选出必须首先查看年龄的重复名称(最低值被过滤),然后是当时(最高时间过滤掉)然后DESC LIMIT 5.
所以唯一正确的结果将是这样的:
| Susan | 35 | 10:60 |
| Peter | 33 | 10:40 |
| Jack | 32 | 10:50 |
| Jill | 31 | 10:20 |
| Peter | 31 | 10:30 |
答案 0 :(得分:2)
SELECT
Name, Age, MIN(Time) As LowestTime
FROM
People
GROUP BY
Name, Age
ORDER BY
Age DESC, Name ASC
LIMIT 5
答案 1 :(得分:1)
SELECT Name,Age,Max(Time) as Time
FROM People
GROUP BY concat(Age,':',Name)
ORDER BY Age DESC,Time ASC
LIMIT 5
GROUP BY照顾Susan,Peter的ORDER BY
答案 2 :(得分:0)
我相信这个查询就是你要找的。它按名称过滤:年龄,然后按名称:时间,最后按名称和ORDER
进行最终分组。
<强>查询强>
SELECT `Name`, `Age`, `Time`
FROM `People`
WHERE concat(`Name`,'-',`Time`)
IN (
SELECT concat(`Name`,'-',MAX(`Time`))
FROM `People`
WHERE concat(`Name`,'-',`Age`)
IN (
SELECT concat(`Name`,'-',MIN(`Age`))
FROM `People`
GROUP BY `Name`
)
GROUP BY `Name`
)
GROUP BY `Name`
ORDER BY `Age` DESC
LIMIT 5
注意: 虽然这是一个有效的查询并返回您正在寻找的结果,但它会变得相当昂贵,尤其是对于更大的表格。如果您打算在更大的表上进行此过滤,我建议您添加一个列,您可以手动连接这些字段,并为这两列设置索引。此外,我假设这只是一个简单的示例,但如果您还应设置id
列PRIMARY
和auto_increment
。