我有一个db的项目,我需要从中找到在过去30分钟内创建的项目,并希望按它们的category
排序,然后我想要在过去1小时内创建的项目,但我想排除之前找到的项目,并且我想再次按它们的category
排序。
我当前使用的方法是使用联合。我不太确定这是不是最好的办法。我的直觉告诉我有更好的办法,只是不知道怎么做。
下面是一组数据和查询示例
id category_id created_at
1 1 10 mins ago
2 1 12 mins ago
3 2 10 mins ago
4 2 14 mins ago
5 1 40 mins ago
6 2 43 mins ago
7 1 34 mins ago
(select * from items where created_at >= NOW() - 30 mins order by category_id) union (select * from items where created_at >= NOW() - 60 mins and created_at < NOW() - 30 mins order by category_id)
示例查询显然语法不正确。
创建表create table items (id int(11), category_id int(11), created_at datetime);
id category_id created_at
1 1 10 mins ago
2 1 12 mins ago
3 2 10 mins ago
4 2 14 mins ago
5 1 40 mins ago
7 1 43 mins ago
6 2 34 mins ago
你的想法是正确的,但正确的语法是:
SELECT "last 30 minutes" as t, category_id, count(*) as cnt
FROM items
WHERE created_at >= NOW() - INTERVAL 30 MINUTE
GROUP BY category_id
UNION ALL
SELECT "last 1 hour" as t, category_id, count(*) as cnt
FROM items
WHERE
created_at < NOW() - INTERVAL 30 MINUTE
AND created_at >= NOW() - INTERVAL 60 MINUTE
GROUP BY category_id
…等…
此查询将统计过去30分钟内的事件,按category_id分组,然后是过去一小时内的所有事件,但不包括过去30分钟内的事件。
UNION ALL
在这种情况下比UNION更好,因为UNION将返回唯一的行。
编辑
根据你更新的问题,我想你正在寻找这个:
SELECT items.*
FROM items
WHERE created_at>=NOW() - INTERVAL 60 MINUTE
ORDER BY
(created_at >= NOW() - INTERVAL 30 MINUTE) DESC,
category_id
如果你有更多的间隔,那么你可以这样使用:
SELECT items.*
FROM items
WHERE created_at>=NOW() - INTERVAL 120 MINUTE
ORDER BY
(created_at >= NOW() - INTERVAL 30 MINUTE) DESC,
(created_at >= NOW() - INTERVAL 60 MINUTE) DESC,
category_id