我在某个地方看到了从多个具有多个条件的表中进行选择的这种格式,并且已经实现了很多年。我想知道的是我们有没有办法让它更快。
查询背景:我正在从消息表B/W中选择消息学生和导师,以获取学生在作业表中发布的作业。
导师信息存储在tutor info表中,studentinfo存储在studentinfo表中。
请告诉我这是什么样的加入。有人告诉我这是交叉连接,但我不确定。我直到最近才知道加入,但从来没有必要。这种格式已经为我服务了很长一段时间了。我不确定如何使用连接格式会使它更好,如果有更好的话。
现在的问题是:
SELECT
messages.* ,
tutorinfo.id as tutor_id,
jobs.student_id as student_id, jobs.job_title
from messages, tutorinfo, studentinfo, jobs where
messages.job_id= jobs.id and jobs.student_id = '3' and messages.thread_id = '2' and messages.tutor_id = tutorinfo.id and messages.job_id = jobs.id and studentinfo.id=jobs.student_id
最佳答案
这是你的精选语句,用更现代的风格写的。在这种样式中,您可以看到连接(注意,它们都是内部连接)。您可以知道它们是内部联接(在我们的两个查询中),因为上联接的列由相等的联接。在您的方法中,要使用交叉连接或外部连接,您需要特殊的格式(而不仅仅是=
),使用特殊语法的“连接”格式。
SELECT m.*,
t.id as tutor_id,
j.student_id as student_id, j.job_title
from messages m
join jobs j on m.job_id = j.job_id
join studentinfo s on j.student_id = s.id
join tutorinfo t on m.tutor_id = t.id
where j.student_id = '3' and m.thread_id = '2'
有一点很清楚——studentinfo不可用,你可以去掉它。
除此之外,在所有用作连接的列中添加索引,我在优化方面看不到太多。
SELECT m.*,
t.id as tutor_id,
j.student_id as student_id, j.job_title
from messages m
join jobs j on m.job_id = j.job_id
join tutorinfo t on m.tutor_id = t.id
where j.student_id = '3' and m.thread_id = '2'