2015-09-25 99 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