我正在开发一个小的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)
答案 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