2014-08-28 78 views
1

我試圖在登錄表中從students_informations表和「用戶名,用戶名,用戶姓名」中同時獲得「學校名稱」的3個表。MySQL加入語法錯誤

我需要做的是獲取「用戶數據」,「學校數據」,然後通過在我的asc_to_school表中使用user_idschool_id進行匹配。

這裏是我的schools_informations表,我需要的學校ID,並在asc_to_schools匹配表,並schools_name顯示爲輸出($變量):

id | school_id | school_name  | school_type  | type | la_name   | region 
----+-----------+-----------------+-----------------+------+-----------------+-------- 
1 | 8432627 | Glasgow Gaelic | Local Authority | Both | Glasgow City | WE 
2 | 5349834 | Breadalbane  | Local Authority | Both | Perth & Kinross | TF 
3 | 7235142 | ForestFortres | Local Authority | Both | undefined  | WE 

這裏是我的登錄狀態表:

id | username | pass | region | la    | name | surname | role 
----+----------+------+--------+------------------+-------+---------+------ 
1 | Can  | **** | none | Clackmannanshire | Can | Sinal | ASC 
2 | Tumer | **** | none | Argyll & Bute | Tumer | Kologlu | GM 
3 | Kerem | **** | none | Somethingelse | Kerem | Citak | ADM 
4 | Pelin | **** | none | Somethingelse | Pelin | Karahan | GM 
5 | Irem  | **** | none | Somethingelse | Irem | Sevinc | CC 

最後我asc_to_school表看起來像這樣:

user_id | school_id 
---------+----------- 
    1 | 1 
    2 | 1 
    3 | 2 
    4 | 2 
    5 | 3 

下面是一個查詢我想:

SELECT 
u.id, u.name, u.surname, u.role, 
c.user_id, c.school_id, 
s.school_id,s.school_name 
FROM login u, asc_to_school c, school_informations s 
WHERE u.role = 'ASC' AND c.user_id = u.id AND c.school_id = s.id 

正如你可以猜到SQL返回空結果...我搜索了這一點,並發現這個例子(我在另外一個問題試圖查詢),但它沒有爲我工作。

我如何獲得: 只有用戶的「角色」 =「ASC」 和使用asc_to_school表連接與學校這個用戶。

編輯

下面是最後一個查詢我有一個在SQL小提琴作品:

SELECT 
u.id, u.name, u.surname, c.school_id, 
s.school_id,s.school_name 
FROM login u, asc_to_school c, school_informations s 
WHERE u.role = 'ASC' AND c.user_id = u.id AND c.school_id = s.id 

這裏是結果:

object(mysqli_result)#3 (5) { 
    ["current_field"]=> 
    int(0) 
    ["field_count"]=> 
    int(5) 
    ["lengths"]=> 
    NULL 
    ["num_rows"]=> 
    int(0) 
    ["type"]=> 
    int(0) 
} 
+2

你的查詢看起來很好(除了隱式聯接是陳舊的,你應該使用顯式的'JOIN'子句)。它會爲我返回一個結果:http://www.sqlfiddle.com/#!2/8e9c3c/1 – Barmar 2014-08-28 23:14:30

+0

這是一個學校作業嗎?你真的應該學習用更加標準的ansi-92格式編寫查詢......使用連接...你在這裏寫的東西很古老,很難閱讀......儘管如此,仍然有相同的功能。呃,你的別名也會增加混淆。否則...這看起來正確 – Twelfth 2014-08-28 23:16:48

+0

@Telfelf對於他自己,我強烈鼓勵別名。它允許您創建有意義的表名而不會創建過度冗長的查詢。 – Barmar 2014-08-28 23:20:39

回答

0

試試這個:

SELECT 
    u.id, 
    u.name, 
    u.surname, 
    u.role, 
    c.user_id, 
    s.school_id, 
    s.school_name 
FROM login u 
INNER JOIN asc_to_school c ON c.user_id = u.id 
INNER JOIN school_informations s ON s.id = c.school_id 
WHERE TRIM(u.role) = 'ASC' 
+1

爲什麼你使用'LIKE'而不是'='?這是邏輯不兼容的變化。 – Barmar 2014-08-28 23:15:52

+0

因爲他得到了一個空的結果集 - 角色字段中可能會有一些額外的字符或空格。這就是爲什麼我要求OP進行嘗試的原因。 – Donal 2014-08-28 23:17:17

+1

更好的是'WHIM TRIM(u.role)='ASC'。因爲'LIKE'也會匹配'ASC1'。 – Barmar 2014-08-28 23:19:46

0

使用明確的JOIN語法,這是很容易理解和維護:

SELECT u.id, u.name, u.surname, u.role 
    , c.user_id, c.school_id 
    , s.school_name 
FROM login u 
JOIN asc_to_school  c ON c.user_id = u.id 
JOIN school_informations s ON s.school_id = c.school_id -- ?not s.id? 
WHERE u.role = 'ASC'; 

我懷疑你真的想加入到s.school_id?你的例子表明否則,但我懷疑你的數據在你的例子是誤導。您的文字說:

這裏是我的schools_informations表,我需要採取school_id並在asc_to_schools

大膽重點煤礦匹配。
school_id 被複制到SELECT列表中。許多客戶端不會吞下重複的列名稱。

+0

你可能會遇到重複的school_id列。 – Donal 2014-08-28 23:59:54