mysql - 如何编写一个带有 where 子句的左连接来限制多个表的左侧部分?

标签 mysql sql

我正在尝试编写一个 SQL 查询,该查询将根据跨多个其他表的数据在一个表中收集某些数据。那部分很简单。不幸的是,我还需要从第二个表中恢复数据,这需要通过左连接来完成。

如果我只是做一个左连接,e。 g.

select *
from table_A A
left join table_B B on A.id=B.id

一切都很好。我可以足够安全地添加 where 子句,例如

where A.id>5

例如,当我尝试在左侧放置多个表格时会出现此问题

select *
from table_A, table_C
left join table_B on A.id=B.id
where table_A.id=table_C.id

突然之间,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

不幸的是,不能保证每个用户都存在 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

最佳答案

理想情况下,您不应将惰性连接语法(select ... from a,b,c)与更具体的select ... from a join B .. . 加入 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 ...

关于mysql - 如何编写一个带有 where 子句的左连接来限制多个表的左侧部分?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8261179/

相关文章:

sql - 简单的 SQL - 计数函数

php - UUID 在 MySQL 中以二进制形式存储

mysql - 当 SQL 年龄 = 当前日期时更新

mysql - 查询Mysql以选择1列但有2种不同类型的数据

sql - 如何汇总SQL表以有条件地返回值

PHP/mysql 未按预期检索

php - sqs 按值升序排列

mysql - LOAD DATA LOCAL INFILE 跳过行而不发出警告

MySQL:解决我的 MySQL 光标错误:1064

mysql - MySQL 中除了使用 UNION @ UNION ALL 之外合并 2 个以上的 SELECT 语句