需要为mysql中的每个类别提取最旧的活动行

时间:2013-12-13 20:22:10

标签: php mysql sql greatest-n-per-group

我想知道是否有更好的方法来提取我需要的其他6个单独选择查询的数据集。

我有一个名为“events”的表,其中包含带有时间戳(日期),“活动”列(int 1处于活动状态)的事件以及“category”列(有6个类别,这是INT)和“ispaid”列(支付INT 1)。我需要按每个类别提取最早的有效付费活动。我有6个不同的选择查询,但我担心数据库越来越大,这可能会导致效率低下。

我想知道是否有更好的方法来做到这一点?

Events Table
------------
id       INT
ispaid   INT  -- 1 is paid
category INT  -- references another table but dont need to join as of now
active   INT  -- 1 is active
ts       DATE -- event date

2 个答案:

答案 0 :(得分:0)

那样的东西?

SELECT *
FROM events_tbl
WHERE events_tbl.active = 1 AND events_tbl.ispaid = 1
GROUP BY events_tbl.category
ORDER BY events_tbl.ts ASC

答案 1 :(得分:0)

如果我没有弄错,很可能你正在寻找这样的东西:

select e1.* from events e1
join (
  select category, min(ts) oldestDate from events
  where ispaid = 1 and active = 1
  group by category
) e2 on e1.category = e2.category and e1.ts = e2.oldestDate
where e1.ispaid = 1 and e1.active = 1

这为每个类别提供已支付且处于活动状态的最早日期。然后将该数据连接回事件表。双where子句应该比离开外部子句更快,因为在内部选择中处理的记录越少。