我正在尝试编写一个SQL查询,它将根据其他几个表中的数据在一个表中收集某些数据.那部分很容易.不幸的是,我还需要从第二个表中恢复数据,这需要使用左连接来完成.
如果我只是做左连接,例如
select *
from table_A A
left join table_B B on A.id=B.id
Run Code Online (Sandbox Code Playgroud)
一切都好.我可以足够安全地添加where子句,比如
where A.id>5
Run Code Online (Sandbox Code Playgroud)
例如,当我尝试在左侧有多个表时,会出现问题
select *
from table_A, table_C
left join table_B on A.id=B.id
where table_A.id=table_C.id
Run Code Online (Sandbox Code Playgroud)
突然之间,A.id不再是公认的专栏.我尝试更改它,以便我选择A.id作为foo,然后选择foo = B.id,但foo也不被识别.('on子句'中的未知列'bla')
虽然有许多引用,但解释如何进行连接子句,并且一些示例甚至使用简单的where子句,我找不到任何组合连接子句,where子句和左侧的多个表.
有关问题的背景:
我的原始查询是:
select SQL_CALC_FOUND_ROWS tutor_user.username
, tutor_user.userid
, tutor_tutor.rate
, tutor_user.username
from tutor_user
, tutor_attends
, tutor_tutors_in
, tutor_subject
, tutor_tutor
where tutor_user.userid=tutor_attends.userid
and tutor_attends.schoolid=80
and tutor_tutors_in.userid=tutor_user.userid
and tutor_tutors_in.subjectid=tutor_subject.subjectID
and tutor_subject.name='Aerospace Studies'
and tutor_tutor.userid=tutor_user.userid //ERROR
LIMIT 0, 15
Run Code Online (Sandbox Code Playgroud)
遗憾的是,无法保证每个用户都会存在tutor_tutor信息 - 这是在网站/数据库设计周期早期不良决策中存在的一个小缺陷.因此,简单的解决方案是将其转换为连接.
问题是,我找不到任何好的教程解释如何将连接与where子句结合起来.我尽最大努力提出以下建议:
select SQL_CALC_FOUND_ROWS tutor_user.username
, tutor_user.userid
, tutor_tutor.rate
, tutor_user.username
from tutor_user
, tutor_attends
, tutor_tutors_in
, tutor_subject
LEFT JOIN tutor_tutor
on tutor_user.userid=tutor_tutor.userid
where tutor_user.userid=tutor_attends.userid
and tutor_attends.schoolid=80
and tutor_tutors_in.userid=tutor_user.userid
and tutor_tutors_in.subjectid=tutor_subject.subjectID
and tutor_subject.name='Aerospace Studies'
LIMIT 0, 15
Run Code Online (Sandbox Code Playgroud)
理想情况下,您不应将延迟连接语法(select ... from a,b,c)与更具体的混合select ... from a join B ... join c ....做一个select *也可能有问题,特别是你不会使用所有的字段,或者需要按名称而不是位置来引用字段.
所以你的查询应该是:
SELECT A.field, A.otherfield, B.field, B.otherfield, C.yetanotherfield
FROM table_A AS A
JOIN table_B as B on A.id = B.a_id
JOIN table_C as C on B.id = C.b_id
WHERE ...
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
23277 次 |
| 最近记录: |