CREATE TABLE IF NOT EXISTS FRUITS (
ID INT(11) NOT NULL AUTO_INCREMENT,
owner VARCHAR(45) DEFAULT NULL,
fruit VARCHAR(45) DEFAULT NULL,
colour VARCHAR(45) DEFAULT NULL,
comments VARCHAR(45) DEFAULT NULL,
incident_date DATE DEFAULT NULL,
PRIMARY KEY (ID)
) ENGINE=MyISAM;
INSERT INTO `your_db`.`FRUITS` (ID, owner, fruit, colour, comments, incident_date) VALUES
(NULL, 'Sam', 'apple', 'green', 'bought', '2016-11-01'),
(NULL, 'John', 'lemon', 'yellow', 'borrowed', '2016-11-02'),
(NULL, 'Oscar', 'lemon', 'yellow', 'found', '2016-11-03'),
(NULL, 'Oscar', 'apple', 'green', 'stolen', '2016-11-04'),
(NULL, 'Sam', 'kiwi', 'green', 'inherited', '2016-11-05'),
(NULL, 'Oscar', 'apple', 'green', 'eaten', '2016-11-06'),
(NULL, 'Oscar', 'apple', 'yellow', 'grown', '2016-11-09');
我有一个数据表,其中的人和他们的财产从MySQL查询中获取数据,我需要过滤掉奥斯卡处理过的苹果。我不在乎他们是否被发现,被盗或被吃掉,但我需要得到最后一次事件(它是在11月6日被吃掉的)。基本上只有2行:
Oscar | apple | green | eaten | 2016-11-06
Oscar | apple | yellow | grown | 2016-11-09
这一个:
SELECT DISTINCT * FROM FRUITS
WHERE owner LIKE 'Osc%' AND fruit LIKE 'apple' AND colour LIKE '%%'
ORDER BY owner ASC
返回3行(绿色被盗和被吃掉),但我只需要后者。
有可能将Distinct列分开,如下所示:
SELECT comments, incident_date, DISTINCT owner, fruit, colour
FROM FRUITS WHERE owner LIKE 'Osc%' AND fruit LIKE 'apple' AND colour LIKE '%%'
ORDER BY owner ASC
这种可能性并不存在。还有其他人吗?
(实际情况是杂志中的广告提案是针对客户的。有些提案是在不同时间在同一地区(例如1/2页)的不同时间提出的。我只需要过滤掉提案此广告尺寸的客户在该日期被拒绝。两种不同的拒绝令人困惑。)
答案 0 :(得分:2)
一种方法是为每个唯一所有者,水果颜色和最大事件日期生成一组没有评论的数据,然后联接回基集以包含评论。
SELECT *
FROM fruits F
INNER JOIN (SELECT max(Incident_date) mID, Owner, Fruit, Color
FROM Fruits
GROUP BY Owner, Fruit, Color) FM
on FM.Owner = F.Owner
and Fm.Fruit = F.Fruit
and FM.Color = F.Color
and FM.Mid = F.Incident_Date
WHERE F.Owner = 'Oscar' and F.Fruit = 'apple'
如果你不关心引擎选择哪个注释,mySQL中的一个简单组就可以了...... mySQL扩展了组,所以引擎选择的注释将是不确定的,因为它不在组中。
SELECT Owner, Fruit, Color, comment, max(Incident_date)
FROM Fruit
GROUP BY Owner, Fruit, Color
答案 1 :(得分:1)
这是非常常见的greatest-n-per-group问题的变体。
如何获得给定所有者/水果/颜色组合的最新行?
换句话说,尝试将这样一行(称之为F1)加入到具有相同所有者/水果/颜色的另一行(称为F2),以及更新的id。如果未找到匹配项,则外部联接将返回F2.*
的所有NULL。
SELECT F1.* FROM FRUITS AS F1
LEFT OUTER JOIN FRUITS AS F2
ON F1.owner = F2.owner
AND F1.fruit = F2.fruit
AND F1.colour = F2.colour
AND F1.ID < F2.ID
WHERE F2.ID IS NULL AND F1.owner = 'Oscar' AND F1.fruit = 'apple';