按订单分组,每组限制

时间:2012-08-25 15:08:48

标签: mysql group-by limit

我正在开发一个小的RSS Feed电子邮件。

我拥有的四个表是用户,订阅源,订阅和分发。 Feed包含实际的Feed详细信息,Subscriptions将Users连接到Feed,而Distribution包含记录rss feed帖子的电子邮件事务。

我尝试查询“分配”表以获取每个用户/订阅源订阅的最新记录。我有以下查询,但它显然只返回一行。我需要使用一个子查询,但我无法解决这个问题。

SELECT d.id, d.user_id, d.feed_id, d.created
FROM Distribution AS d
INNER JOIN Feeds AS f ON f.id = d.feed_id
INNER JOIN Subscriptions AS s ON s.feed_id = d.feed_id
GROUP BY d.id, d.user_id, d.feed_id
ORDER BY d.created DESC 
LIMIT 1

分配表数据 id,created,feed_id,post_id,user_id,success

(0, '2012-08-31 09:37:49', 20, 3, 2, 1)
(1, '2012-08-25 09:36:21', 20, 1, 1, 1)
(2, '2012-08-25 09:37:49', 21, 1, 2, 1)
(4, '2012-08-25 09:39:06', 21, 4, 1, 1)
(5, '2012-08-25 10:12:29', 20, 7, 2, 0)
(6, '2011-05-24 10:34:30', 20, 112, 1, 0)

以下查询产生以下结果

SELECT Distribution.*
FROM   Distribution NATURAL JOIN (
  SELECT   user_id, feed_id, MAX(created) AS created
  FROM     Distribution
  GROUP BY user_id, feed_id
) t

(0, '2012-08-31 09:37:49', 20, 3, 2, 1)
(1, '2012-08-25 09:36:21', 20, 1, 1, 1)
(2, '2012-08-25 09:37:49', 21, 1, 2, 1)
(4, '2012-08-25 09:39:06', 21, 4, 1, 1)

1 个答案:

答案 0 :(得分:2)

正如MySQL manual

中所述
  

服务器可以自由选择每个组中的任何值,因此除非它们相同,否则所选的值是不确定的。此外,添加ORDER BY子句不会影响每个组中值的选择。选择值后会对结果集进行排序,ORDER BY不会影响服务器选择的值。

您正在尝试查找groupwise maximum,这需要使用子查询来识别最新记录。

子查询本身应该使用created列上的MySQL MAX()函数来识别每个组中最近记录的对应值,然后使用该信息加入外部/父组中的表查询。我认为这就是你所追求的,但如果没有你的表架构/样本数据很难确定(至少它应该让你走上正确的道路):

SELECT Distribution.*
FROM   Distribution NATURAL JOIN (
  SELECT   user_id, feed_id, MAX(created) AS created
  FROM     Distribution
  GROUP BY user_id, feed_id
) t