2015-09-25 80 views
3

以下查询尝试执行可表示为@users.courses(其中@ user.id = 1)的内容。我给这个信息,我不能完全肯定这是否是正确的,因为查询不会运行SQL抱怨现有字段

SELECT * FROM courses WHERE courses.id = 
courses_users.user_id AND courses_users.user_id = 1 

SQL抱怨:

#1054 - 未知列“courses_users.user_id”在'where子句中'

我确定所有这些字段都存在,所以我不确定我在做什么错。

回答

2

where子句引用courses_users,但这绝不表出现在wherejoin条款。

你要么把它添加到from条款:

SELECT * 
FROM courses, courses_users -- Here! 
WHERE courses.id = courses_users.user_id AND 
     courses_users.user_id = 1 

或者,更好的是,使用一个明确的join条款:

SELECT * 
FROM courses 
JOIN courses_users ON courses.id = courses_users.user_id -- Here! 
WHERE courses_users.user_id = 1 
+0

如果我发现没有'JOIN'查询更容易理解它是一个问题吗?它被认为是“坏代码”? – Bula

+0

隐式联接(第一个示例)在大多数RDBMS中都被视为弃用。他们不是严格禁止的,但是继续使用它们通常被认为是不好的做法。 – Mureinik

+0

另外我刚刚发现为了实现我使用rails语法描述的第二行必须替换为'courses.id = courses_users.course_id' – Bula

1

您错过了JOIN。声明不知道关于courses_users,除非你JOIN它。对于这个您的查询需要看起来像这样:

SELECT * 
FROM courses 
JOIN courses_users ON 
    courses.id = courses_users.user_id 
WHERE 
    courses_users.user_id = 1 
1

你试图以仅显示记录,其中课程。 ID在不同的表中匹配不同的值?如果是这样,你需要将两个表一起加入。如果不加入连接,则无法比较两个不同表中的两个不同字段。

这里有一个关于SQL连接的工作原理教程:SQL Joins