MySQL查询需要大量(复杂?)过滤

时间:2012-01-08 16:32:58

标签: mysql sql

我有以下数据库表(人员):

+--------+--------+--------+
|  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 |

3 个答案:

答案 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

注意: 虽然这是一个有效的查询并返回您正在寻找的结果,但它会变得相当昂贵,尤其是对于更大的表格。如果您打算在更大的表上进行此过滤,我建议您添加一个列,您可以手动连接这些字段,并为这两列设置索引。此外,我假设这只是一个简单的示例,但如果您还应设置idPRIMARYauto_increment