2009-05-14 5 views
2

私はかなりmysqlを使い慣れていないので、わかりません。次のような表があります:列1および列2ごとにどのように最新のエントリを選択しますか?

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

このテーブルにプライマリキー(単一または組み合わせ)がありますか? – Powerlord

答えて

5

このになるはずですが、テストしていません。

SELECT orders.* FROM orders 
INNER JOIN (
    SELECT emp, cat, MAX(date) date 
    FROM orders 
    GROUP BY emp, cat 
) criteria USING (emp, cat, date) 

基本的に、これはあなたがAMT兼BY GROUPことができないので(そのためのすべてのデータを取得するために、元のテーブルに対してということに参加し、各EMPと猫のための最新のエントリを取得するためにサブクエリを使用しています)。

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、猫、日付)が候補キーを備えていることを前提としています。私。指定されたempのペアの日付は1つだけです& cat。

+0

@ R.Bremroseのクエリは同じ仮定をします – Andomar

+0

Mmm、そうではありません。 Mineは、MAX(日付)と一致する各empとcatの行を返します。 – Powerlord

+0

右 - OPはemp&catごとに* 1つの*行を必要としました。ソリューションと私の両方がemp&catごとに複数の行を返す可能性があります。 –

関連する問題