您可以通过使用变量来模拟ROW_NUMBER。
SELECT d, title, karma
FROM (
SELECT
title,
karma,
DATE(date_uploaded) AS d,
@rn := CASE WHEN @prev = UNIX_TIMESTAMP(DATE(date_uploaded))
THEN @rn + 1
ELSE 1
END AS rn,
@prev := UNIX_TIMESTAMP(DATE(date_uploaded))
FROM image, (SELECT @prev := 0, @rn := 0) AS vars
ORDER BY date_uploaded, karma DESC
) T1
WHERE rn <= 3
ORDER BY d, karma DESC
结果:
'2010-04-26', 'Title9', 9
'2010-04-27', 'Title5', 8
'2010-04-27', 'Title6', 7
'2010-04-27', 'Title7', 6
'2010-04-28', 'Title4', 4
'2010-04-28', 'Title3', 3
'2010-04-28', 'Title2', 2
Quassnoi大约有一个很好的文章,其解释更详细的技术:Emulating ROW_NUMBER() in MySQL - Row sampling。
测试数据:
CREATE TABLE image (title NVARCHAR(100) NOT NULL, karma INT NOT NULL, date_uploaded DATE NOT NULL);
INSERT INTO image (title, karma, date_uploaded) VALUES
('Title1', 1, '2010-04-28'),
('Title2', 2, '2010-04-28'),
('Title3', 3, '2010-04-28'),
('Title4', 4, '2010-04-28'),
('Title5', 8, '2010-04-27'),
('Title6', 7, '2010-04-27'),
('Title7', 6, '2010-04-27'),
('Title8', 5, '2010-04-27'),
('Title9', 9, '2010-04-26');
非常感谢您的广泛努力。我对性能有一些顾虑,但是会测试这个,我可能需要缓存输出:) – Ferdy 2010-04-29 19:30:35
@Ferdy:为了提高这个查询的性能,在'(date_uploaded,karma)'上添加一个组合索引。 – 2010-04-29 19:34:40