MySQL DISTINCT并非所有列

时间:2016-11-16 18:13:16

标签: mysql greatest-n-per-group

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页)的不同时间提出的。我只需要过滤掉提案此广告尺寸的客户在该日期被拒绝。两种不同的拒绝令人困惑。)

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)

这是非常常见的问题的变体。

如何获得给定所有者/水果/颜色组合的最新行?

换句话说,尝试将这样一行(称之为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';