2016-06-18 6 views
0

私はプログラミングの面で新しいので、このフォーラムは私にはあまり意味がありません。 特定の基準に基づいてToDoリストを検索するために私のウェブサイトでこのクエリを実行しています。しかし、それはあまりにも遅く実行され、おそらく別の方法でそれを書くことが可能です。このクエリをより速く実行させるにはどうすればいいですか

SELECT * FROM lesson WHERE 
id IN 
(SELECT `lesson_id` FROM `localization_logging` 
WHERE `language_id` = 2 AND `action_id` = 1) 
AND `id` NOT IN 
(SELECT `lesson_id` FROM `localization_logging` 
WHERE `language_id` = 2 AND `part_id` = 1 AND `action_id` = 6) 

クエリは、すべてのレッスンリスト名を検索し、特定のタスクが完了しているかどうかをチェックするためにレッスンテーブルを検索します。タスクが1つのToDoで実行され、次のタスクで表示される場合。この場合、アクション1は実行されますが、アクション6は実行されません。

私はこれを十分に説明してくれることを願っています。私のローカルマシンでは、クエリには1.8秒かかります。また、複数のリストを隣り合わせに印刷しなければならない場合もあります。

私が得ることができるすべてのおかげで!完了としてマークIDのためにこのような

+0

最初にデータベースが実行されているかどうかを確認してください:EXPLAIN yourQuery;結果を投稿すると、何が起こったかを見ることができます –

答えて

0

何か:

SELECT l.*, SUM(ll.action_id=6) completed FROM lesson l 
INNER JOIN localization_logging ll ON ll.lesson_id = l.id 
WHERE ll.language_id = 2 AND 
(
ll.action_id = 1 
    OR 
ll.action_id = 6 AND ll.part_id == 1 
) 
GROUP BY l.id 

そして今、我々がそれをラップすることができます:あなたは通常より速くクエリがINNER/LEFT JOINで行をフィルタリング取得します

SELECT t.* FROM (...) t WHERE t.completed = 0 
0

が、あなたが必要としますそれをテストする。

SELECT lesson.* FROM lesson 
INNER JOIN localization_logging task1 
    ON lesson.id = task1.lesson_id 
LEFT JOIN localization_logging task2 
    ON lesson.id = task2.lesson_id 
    AND task2.language_id = 2 
    AND task2.part_id = 1 
    AND task2.action_id = 6 
WHERE task1.language_id = 2 
AND task1.action_id = 1 
AND task2.lesson_id IS NULL 

第二の表は、複数の条件に参加しましたが、結果にあった唯一の結果はヌルとして「力が加わっ」のでON句内でそれらをリストする必要がされて必要とされている(左側を左手段はどんなとどまりません参加)。

Btw。 task1条件が結果を1つの行に限定しない場合は、lessonから複数の行が得られます。GROUP BY lesson.id

関連する問題