2011-11-07 57 views
1

我試圖做同樣的MySQL表多次join,但我沒有得到我期望得到的結果。希望有人能指出我的錯誤。從另一個表中多次加入在MySQL查詢

Table 1 - cpe Table 

|id | name 
|---------- 
| 1 | cat 
| 2 | dog 
| 3 | mouse 
| 4 | snake 
----------- 

Table 2 - AutoSelect 

|id | name | cpe1_id | cpe2_id | cpe3_id | 
|----------------------------------------------- 
| 1 | user1 | 1  | 3  | 4  | 
| 2 | user2 | 3  | 1  | 2  | 
| 3 | user3 | 3  | 3  | 2  | 
| 4 | user4 | 4  | 2  | 1  | 
------------------------------------------------ 

我想看到的

user1 | cat | mouse | snake | 
user2 | mouse | snake | dog | 
..etc 

這裏的輸出是什麼,我都試過

SELECT * FROM AutoSelect 
LEFT JOIN cpe ON 
(cpe.id = AutoSelect.cpe1_id) AND 
(cpe.id = AutoSelect.cpe2_id) AND 
(cpe.id = AutoSelect.cpe3_id) 

我得到空的結果。我以爲我知道如何做這些連接,但顯然當我試圖匹配cpe?_id與cpe表的名稱時。

在此先感謝您的幫助。

+0

確定輸出應該user2的 - 「鼠蛇狗」,而不是「貓鼠狗」? – xoid

回答

1

你需要左連接3次爲好。目前你的查詢只能加入1次,加入3個關鍵詞。這應該這樣做:

SELECT a.name, cpe1.name, cpe2.name, cpe3.name FROM AutoSelect as a 
LEFT JOIN cpe as cpe1 ON (cpe1.id = a.cpe1_id) 
LEFT JOIN cpe as cpe2 ON (cpe2.id = a.cpe2_id) 
LEFT JOIN cpe as cpe3 ON (cpe3.id = a.cpe3_id) 

你大概的意思是INNER JOIN,而不是LEFT JOIN,除非允許空值在自動選擇表。

0

我覺得你的設計是錯誤的。

有了這樣的表,你得到它,它的意思是在關係數據庫的方式:

table 1 : animal 
id name 
1 cat 
2 dog 
3 mouse 
4 snake 


table 2 : user 
|id | name | 
|-------------- 
| 1 | user1 | 
| 2 | user2 | 
| 3 | user3 | 
| 4 | user4 | 

table 3 : association 
|id_user | id_animal| 
|-------------------- 
| 1  | 1  | 
| 1  | 3  | 
| 1  | 4  | 
| 2  | 3  | 
| 2  | 1  | 
| 2  | 2  | 
| 3  | 3  | 
| 3  | 2   
| 4  | 4  | 
| 4  | 2  | 
| 4  | 1  | 
--------------------- 

然後:

選擇u.name,從用戶u,動物a.name,關聯屁股在哪裏ass.user_id = u.id和ass.animal_id = a.id;

+1

是的,傑羅姆克,你是對的。設計不正確。我獲得了爲Yii構建的數據庫和許多表的責任。我發佈的內容只是表格中列的1/8。我試圖用「動物」縮短。 :)

不幸的是,沒有我進去和改變了很多頁面,我必須對這個表執行查詢來提取數據。聯合將是一個痛苦。感謝您的迴應,我將測試這兩個想法! - 回到美國 – Geo99M6Z

0

在這種情況下,您的解決方案不會產生良好的動態數據庫。還有其他方法可以組合多個表。我可以通過我自己的數據庫向您展示您應該使用什麼以及何時使用此解決方案。該計劃是在荷蘭,但你可能會理解關鍵字。

和你一樣,我有我的風車與千瓦時米,其中有測量風車我的energyproduction結合起來。你應該做什麼,是這種情況,正在製作另一張桌子(在我的例子中是molenkWhlink)。確保你的表是INNODB類型(用於製作外鍵)。我所做的是將我的計量表和磨機組合在一起,方法是在新表格中放入其ID(荷蘭Volgnummer)中的指示器(外鍵)。您可能不需要的一個優點,但我確實這樣做了,事實上,我可以在鏈接或取消鏈接時使用時間戳和米值等連接和斷開信息擴展額外表格。這使您的數據庫方式更具動態性。

在我的情況,我也有一個表meassurements(metingoverzicht)。正如你在計劃中看到的,我有兩條線從Metingoverzicht轉到molenkwhlink。原因很簡單。我所採取的所有措施都將保存在表格Metingoverzicht中。每日測量(預定)將會有一個特殊的布爾值,但不定期的測量結果,也會在這裏保存下來,bollean關閉。當切換儀表時,我需要離開儀表的終值和新儀表的起始值,以計算今天的能量生產值。這是您的解決方案進入的地方,並且額外的表格不起作用。通常,當你只需要另一個表中的一個值時,就會使用JOIN。在這種情況下的問題是,我有1個鏈接中的2個meassurementID(1個用於連接,1個用於斷開連接)。他們都指向同一個表列,因爲他們都需要保存相同類型的信息。這是當你可以使用從一個表到另一個表的雙重JOIN。因爲,這兩個值只能使用一次,只需要保存在不同的地方,以避免在不同位置存儲一個動作,這應始終避免。

http://s1101.photobucket.com/user/Manuel_Barcelona/media/schemedatabase.jpg.html

相關問題