問題: カテゴリごとに、1 つのカテゴリに少なくとも 10 個のアイテムを持っている最初の 2 人のユーザーを見つけます。
テーブル構造:
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 権限しかありません。