我有一些值在我的表中重复,我想只选择那些具有最新/最高日期的值,即:
ID Type Name Value Date
-- ------- ----- ------- -------------
1 "FRUIT" "APPLE" "Imported" "2011-03-19 22:08:13"
5 "FRUIT" "LEMON" "Imported" "2011-03-19 22:00:44"
22 "FRUIT" "PEACH" "Imported" "2011-03-20 11:03:13"
31 "FRUIT" "MELON" "Imported" "2011-04-28 18:42:07"
44 "FRUIT" "PEACH" "Imported" "2011-04-12 11:06:11"
98 "FRUIT" "CHERRY" "Imported" "2011-03-19 22:46:04"
211 "FRUIT" "MELON" "Imported" "2011-03-19 22:25:24"
217 "VEG" "SPINACH""Imported" "2011-03-19 22:25:24"
我想选择这些:
ID Type Name Value Date
-- ------- ----- ------- -------------
1 "FRUIT" "APPLE" "Imported" "2011-03-19 22:08:13"
5 "FRUIT" "LEMON" "Imported" "2011-03-19 22:00:44"
31 "FRUIT" "MELON" "Imported" "2011-04-28 18:42:07"
44 "FRUIT" "PEACH" "Imported" "2011-04-12 11:06:11"
98 "FRUIT" "CHERRY" "Imported" "2011-03-19 22:46:04"
这是我需要的简化版本,我的表有大约20列,所以我想选择*,如果不是,我可以逐个选择。
所以我想选择* FRUIT类型的行,但只选择那些具有最高日期的行。谢谢
答案 0 :(得分:30)
这可以给你你想要的东西:
SELECT *
FROM Table
INNER JOIN
(SELECT Name, MAX(Date) as TopDate
FROM Table
WHERE Type = 'FRUIT'
GROUP BY Name) AS EachItem ON
EachItem.TopDate = Table.Date
AND EachItem.Name = Table.Name
基本上,它会找到每种水果的最新日期,然后显示每个水果的行信息(加入日期和水果名称)。确保将日期字段和名称字段都编入索引。
如果您可以假设具有最高ID的项目也是具有最高日期的项目(典型但在所有情况下都不一定是真的 - 这取决于您的使用案例),您可以改为MAX(ID)
MAX(Date)
的{{1}},并且只使用该ID进行链接,而不是按日期和名称进行链接。
答案 1 :(得分:6)
如果你使用的是mysql,这将命令SELECT所有类型的“水果”,并将订购从最旧到最新的日期:
SELECT * FROM tablename WHERE Type='fruit' ORDER by Date ASC
如果需要,您可以对其进行限制(这将限制为最早的5):
SELECT * FROM tablename WHERE Type='fruit' ORDER by Date ASC LIMIT 5