2016-09-15 2 views
2

table2の最後のフルーツカウントをtable1のクエリに追加しようとしています。サブクエリ別のテーブルの最後の日付/値

table1        table2     
+--------+--------+-------+-----+ +--------+------+-------+ 
| fruit | season | carbs | fat | | fruit | date | count | 
+--------+------+---------+-----+ +--------+------+-------+ 
| apple | summer | 21 | 0 | | apple | 2015 | 700 | 
| banana | all yr | 27 | 0 | | apple | 2014 | 500 | 
+--------+--------+-------+-----+ | banana | 2014 | 200 | 
            | banana | 2013 | 300 | 
            +--------+------+-------+ 

goal: 
+--------+--------+-------+-----+------------+ 
| fruit | season | carbs | fat | last_count | 
+--------+------+---------+-----+------------+ 
| apple | summer | 21 | 0 |  700 | 
| banana | all yr | 27 | 0 |  200 | 
+--------+--------+-------+-----+------------+ 

私が思い付くことができますすべてがこのような何か(動作しない)である。また、

SELECT t1.*, t2.count AS last_count FROM table1 AS t1 
INNER JOIN 
(SELECT fruit, count FROM table2 ORDER BY date DESC) t2 ON t1.fruit = t2.fruit 

、私はTABLE1(例えばWHERE t1.carbs < 25)からの値に基づいて結果をフィルタリングすることができるはず

答えて

0

これを解決する1つの方法は、table1table2に2回参加させることです。最初の結合はカウントがある完全なtable2であり、2番目の結合は各果実の最新の果実のレコードのみを含むtable2の副問い合わせです。

SELECT t1.*, t2.count AS last_count 
FROM table1 t1 
INNER JOIN table2 t2 
    ON t1.fruit = t2.fruit 
INNER JOIN 
(
    SELECT fruit, MAX(date) AS date 
    FROM table2 
    GROUP BY fruit 
) t3 
    ON t2.fruit = t3.fruit AND 
     t2.date = t3.date 
+0

Thanks Tim。それは私が必要とするものを正確に行います。しかし、クエリの実行にはかなりの時間がかかりますので、2つの別々のクエリを使用することがあります。 – gipadm

+0

@gipadm結合に関連する列にインデックスを設定しましたか(つまり、「果物」と「日付」)?これにより、クエリの速度が飛躍的に向上します。 –

+0

日付と果物は、table2で索引付けされました。私は今table1の果物を索引しました。それは少し速く走ります。 – gipadm

関連する問題