2017-01-28 6 views
-2

私は2つのテーブルを持っています。スローMySQL SELECT MAX(ID)はどこのステートメントではありません

最初のテーブルは私のオブジェクト用です(〜1,000行)。私はこのクエリを使用している場合は

Table Name: object 
ID | name 
1 | Dummy object 1 
2 | Dummy object 2 
3 | Dummy object 3 
... 
724 | Dummy object 724 
... 
etc. 

第二表はオブジェクトイベント(200,000行)

Table Name: events 
ID | ID_OBJ | ID_MES | description | timestamp 
1 | 3  | 3071 | Test event | 2017-01-28 12:00:01 
2 | 4  | 3001 | Doors opened | 2017-01-28 13:00:04 
3 | 3  | 3002 | Doors closed | 2017-01-28 13:33:45 
... 
etc... 

のためであり、それはテーブルからデータをロードするために約10秒かかります:

SELECT 
    o.ID, o.name, e.timestamp AS last_event 
FROM 
    object AS o 
LEFT JOIN 
    events AS e 
ON 
    e.ID_OBJ = o.ID 
AND 
    (SELECT MAX(ID) FROM events WHERE events.ID_OBJ = o.ID AND ID_MES != 3071) 
GROUP BY 
    o.ID 

最後のイベントのタイムスタンプを含むオブジェクトのリストを取得する必要がありますが、ID_MES 3071のイベントは含める必要はありません。

私の質問から "AND ID_MES!= 3071"を削除すると、本当に速く動作します。誰もがこの問題の解決策を知っていてスピードを上げることはできますか?

+1

MAX(ID)の目的は何ですか?あなたはそれを何かと比較しません。あなたは 'ON e.ID_OBJ = o.IDとe.ID_MES!= 3071'と書くことができませんでしたか? – fafl

+0

最新のイベントを最も高いIDで選択するためのMAX(ID)。 – VigoKrumins

+0

この回答を確認してください:http://stackoverflow.com/a/7745635/5710637 – fafl

答えて

1

だから、これは動作します:

SELECT o.ID, o.name, MAX(e.timestamp) AS last_event 
FROM 
    object o 
LEFT JOIN 
    events e 
ON 
    e.ID_OBJ = o.ID AND e.ID_MES != 3071 
GROUP BY 
    o.ID 

それは合理的に高速である必要があります。また、最新のイベントの別のフィールドを選択したい場合は、グループごとの最大のタグを調べる必要があります。

フィドル:http://rextester.com/XWLWYS80827

+0

あなたのクエリは完全に機能しますが、それを実行する最速の方法ではありません。それをより速く行う方法を発見しました。 クエリの応答時間:(合計792、クエリは0.1146秒かかりました)。 私の新しいクエリ:(792の合計、クエリは、0.0068秒かかった。) 問合せ:イベントからo.IDを選択、LEFT OなどのオブジェクトからAS last_event o.name e.timestampは、JOIN(MAX(ID)IDを選択して、ID_OBJ GROUP BY ID_OBJ)AS e on ID_OBJ = obj.ID LEFT JOINイベントON events.ID = e.ID AND events.ID_MES!= 3071 GROUP BY obj.ID; しかし、とにかくおかげで、仲間! :) – VigoKrumins

+0

クイック検索が見つかりましたが、何とかコンパイルできません。 – fafl

+0

私の質問を修正しました:SELECT o.ID、o.name、events.timestamp AS last_event FROMオブジェクトからLEO JOIN(SELECT MAX(ID)ID、ID_OBJイベントからGROUP BY ID_OBJまで)e.ID_OBJ = o.ID LEFT JOINイベントはevents.ID = e.ID AND events.ID_MES!= 3071 GROUP BY o.ID; – VigoKrumins

関連する問題