2016-10-13 59 views
0

我遇到了麻煩,提出了所需的查詢來做我以後的事情。MYSQL - 加入三個表(連續?)

我有三個表是這樣的:

client_files 

----------------------- 
client_id  file_id 
----------------------- 
1    2 
1    3 
1    6 
2    1 
2    2 
3    5 



files 

------------------------------------------------- 
ID   file_name   file_category_id 
------------------------------------------------- 
1   file1.ext   1 
2   file2.ext   3 
3   file3.ext   1 
4   file4.ext   1 
5   file5.ext   2 
6   file6.ext   2 



file_categories 

-------------------------- 
ID   category_name   
-------------------------- 
1   category1 
2   category2 
3   category3 

我試圖建立一個查詢將返回文件名和類別名稱爲特定客戶ID。

我期待的結果是(來自ID):

----------------------------- 
file_name  category_name 
----------------------------- 
file2.ext  category3 
file3.ext  category1 
file6.ext  category2 

據我瞭解,我需要加入client_files表到files表,然後到file_categories表。我看過其他的例子,它們將第三張表格連接在一起,然後相信這是一種不同的情況。

這相當於我想到的結果,但結果幾乎是隨機的,有些文件返回時沒有鏈接,有些文件丟失。

SELECT 
    f.file_name, 
    fc.category_name 
FROM 
    client_files cf, 
    files f, 
    file_categories fc 
WHERE 
    cf.client_id = 1 AND f.ID = cf.file_id AND fc.ID = f.file_category_id; 
+0

請參閱[文件](HTTP://開發.mysql.com/doc/refman/5.7/en/join.html)。 –

+0

@JonStirling我在儘可能多地閱讀,但我無法按照我嘗試做的方式讓我的頭腦加入三個。我不明白爲什麼我得到這個看似隨機的結果。 – user2924019

+0

您的查詢將爲我返回正確的結果:http://www.sqlfiddle.com/#!9/cc3bc9/1 – Barmar

回答

0

你需要有適當的連接條件,現在你正在做交叉連接,然後有where條件。

SELECT 
    cf.client_id, 
    f.file_name, 
    fc.category_name 
FROM 
    client_files cf 
LEFT JOIN 
    files f ON cf.file_id = f.ID 
LEFT JOIN 
    file_categories fc ON fc.ID = f.file_category_id 
WHERE 
    cf.client_id = 1; 
+0

與條件在功能上與內部連接相同的交叉連接。 – Barmar

1

你可以用兩種方法做,但我基本上是一樣的。

第一種方式:

SELECT 
    f.file_name, 
    fc.category_name 
FROM 
    client_files cf 
    JOIN files f ON cf.file_id = f.id 
    JOIN file_categories fc ON fc.id = f.file_category_id 

或者,第二種方式:

SELECT 
    f.file_name, 
    fc.category_name 
FROM 
    (client_files cf 
    JOIN files f ON cf.file_id = f.id) data1 
    JOIN file_categories fc ON fc.id = data1.file_category_id 
+0

這相當於他的代碼。它只是使用ANSI JOIN語法而不是隱式連接。 – Barmar

+0

你缺少'cf.client_id = 1'。 – Barmar

0

嘗試此查詢:

SELECT files.file_name, file_categories.category_name 

FROM ((files LEFT JOIN client_files ON files.ID = client_files.file_id) 

LEFT JOIN file_categories ON files.file_category_id = file_categories.ID) 

WHERE client_files.client_id = 1 
+0

沒有理由爲此使用'LEFT JOIN'而不是'INNER JOIN'。你不需要沒有匹配的行。 – Barmar