我对mysql很新,需要一个我无法弄清楚的查询。给出一个像这样的表:
emp cat date amt cum
44 e1 2009-01-01 1 1
44 e2 2009-01-02 2 2
44 e1 2009-01-03 3 4
44 e1 2009-01-07 5 9
44 e7 2009-01-04 5 5
44 e2 2009-01-04 3 5
44 e7 2009-01-05 1 6
55 e7 2009-01-02 2 2
55 e1 2009-01-05 4 4
55 e7 2009-01-03 4 6
我需要根据'emp'和每'cat'选择最新的日期交易。上表会产生类似的内容:
emp cat date amt cum
44 e1 2009-01-07 5 9
44 e2 2009-01-04 3 5
44 e7 2009-01-05 1 6
55 e1 2009-01-05 4 4
55 e7 2009-01-03 4 6
我尝试过类似的事情:
select * from orders where emp=44 and category='e1' order by date desc limit 1;
select * from orders where emp=44 and category='e2' order by date desc limit 1;
...
但这感觉不对。有人能指出我正确的方向吗?
答案 0 :(得分:5)
此应该有效,但我还没有测试过。
SELECT orders.* FROM orders
INNER JOIN (
SELECT emp, cat, MAX(date) date
FROM orders
GROUP BY emp, cat
) criteria USING (emp, cat, date)
基本上,这使用子查询来获取每个emp和cat的最新条目,然后将其与原始表连接以获取该订单的所有数据(因为您不能GROUP BY amt和cum)。
答案 1 :(得分:2)
@ R.Bemrose给出的答案应该有效,这是另一个比较技巧:
SELECT o1.*
FROM orders o1
LEFT OUTER JOIN orders o2
ON (o1.emp = o2.emp AND o1.cat = o2.cat AND o1.date < o2.date)
WHERE o2.emp IS NULL;
这假设列(emp,cat,date)包含候选键。即对于给定的一对emp&amp;只能有一个日期猫。