我在我的网站上运行此查询,以便根据特定条件查找待办事项列表。但它运行得太慢,可能以另一种方式编写它。
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已完成但行动6未完成。
我希望我能够解释这个问题。在我的本地计算机上,查询需要1.8秒,有时我必须在彼此旁边打印多个列表,然后它需要1.8倍的列表,这使得页面加载速度超慢。
答案 0 :(得分:0)
像标记ID一样完成这样的事情:
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
现在我们可以用它包装:
SELECT t.* FROM (...) t WHERE t.completed = 0
答案 1 :(得分: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
第二个表在多个条件下连接,但必须在lesson
子句中列出它们,因为只有结果中的结果才会强制加入" as nulls(左连接意味着左侧不管是什么)都是必需的。
顺便说一下。如果task1
条件没有将结果限制为一行,那么您将从GROUP BY lesson.id
获得多行 - {{1}}。