問題:查找每個類別中至少有10個項目的前2個用戶。每組,找到頭數爲N的用戶,使用SUM(x)> = N
表結構:
CREATE TABLE items(
id INT AUTO_INCREMENT PRIMARY KEY,
datetime datetime,
category INT,
user INT,
items_count INT
);
樣本數據:
INSERT INTO items (datetime, category, user, items_count) VALUES
('2013-01-01 00:00:00', 1, 1, 10),
('2013-01-01 00:00:01', 1, 2, 1),
('2013-01-01 00:00:02', 1, 3, 10),
('2013-01-01 00:00:03', 1, 2, 9),
('2013-01-01 00:00:00', 2, 4, 10),
('2013-01-01 00:00:01', 2, 1, 10),
('2013-01-01 00:00:01', 2, 5, 10);
期望的結果:
category user
1 1
1 3
2 4
2 5
注:由於該結果所示,我需要能夠顯示對用戶偏好當多個用戶同時滿足要求。
SQL小提琴:
http://sqlfiddle.com/#!2/58e60
這是我曾嘗試:
SELECT
Derived.*,
IF (@category != Derived.category, @rank := 1, @rank := @rank + 1) AS rank,
@category := category
FROM(
SELECT
category,
user,
SUM(items_count) AS items_count,
MAX(datetime) AS datetime
FROM items
GROUP BY
category,
user
HAVING
SUM(items_count) >= 10
) AS Derived
JOIN(SELECT @rank := 0, @category := 0) AS r
HAVING
rank <= 2
ORDER BY
Derived.category,
Derived.datetime
但它是錯誤的。它不僅不採取用戶優先考慮,它會產生錯誤的結果與像這樣的數據:
('2013-01-01 00:00:00', 1, 1, 10),
('2013-01-01 00:00:01', 1, 2, 1),
('2013-01-01 00:00:02', 1, 3, 10),
('2013-01-01 00:00:03', 1, 2, 9),
('2013-01-01 00:00:10', 1, 3, 1);
其他信息:我不知道,如果程序可在這一個差異情況,但不幸的是它也不是一種選擇。運行此查詢的用戶只具有SELECT權限。
該帖子的演示文稿似乎只是尖叫作業;和你很像[tag:mysql],我想知道是否應用功課。就這樣。 –
爲什麼user_id 2不可見,它似乎在類別1中有10個項目 – Akash
@BradChristie:[家庭作業標記已被棄用。](http://meta.stackexchange.com/q/147100/161666) –