我有用戶表:電腦用戶有很多計算機,計算機有不同的表中有很多屬性,最好的方法來加入?
USERS:
ID | NAME |
----------------
1 | JOHN |
2 | STEVE |
一個表:磁碟機
PROCESSORS:
ID | NAME |
---------------------------
27 | PROCESSOR TYPE 1 |
28 | PROCESSOR TYPE 2 |
和表:
COMPUTERS:
ID | USER_ID |
------------------
13 | 1 |
14 | 1 |
用於處理器的表
HARDDRIVES:
ID | NAME |
---------------------------|
35 | HARDDRIVE TYPE 25 |
36 | HARDDRIVE TYPE 90 |
中的每個計算機可具有的許多屬性從不同屬性表(處理器,磁碟機等),所以我有交叉點表這樣的,將屬性鏈接到計算機:
COMPUTER_PROCESSORS:
C_ID | P_ID |
--------------|
13 | 27 |
13 | 28 |
14 | 27 |
COMPUTER_HARDDRIVES:
C_ID | H_ID |
--------------|
13 | 35 |
所以用戶JOHN,ID爲1擁有計算機13和14.計算機13具有處理器27和28,並且計算機13具有硬盤驅動器35.計算機14具有處理器27並且不具有硬盤驅動器。
給定一個用戶的ID,我想檢索一個用戶的計算機列表與每個計算機的屬性。
我已經想通了查詢,讓我有點結果的:
SELECT computers.id, processors.id AS p_id, processors.name AS p_name, harddrives.id AS h_id, harddrives.name AS h_name,
FROM computers
JOIN computer_processors ON (computer_processors.c_id = computers.id)
JOIN processors ON (processors.id = computer_processors.p_id)
JOIN computer_harddrives ON (computer_harddrives.c_id = computers.id)
JOIN harddrives ON (harddrives.id = computer_harddrives.h_id)
WHERE computers.user_id = 1
結果:
ID | P_ID | P_NAME | H_ID | H_NAME |
-----------------------------------------------------------
13 | 27 | PROCESSOR TYPE 1 | 35 | HARDDRIVE TYPE 25 |
13 | 28 | PROCESSOR TYPE 2 | 35 | HARDDRIVE TYPE 25 |
但是這有幾個問題...
計算機14不顯示,因爲它沒有硬盤。 我可以以某種方式創建一個OUTER JOIN以確保所有計算機都顯示出來,即使這些計算機沒有某些屬性?
計算機13顯示了兩次,兩個硬盤都有相同的硬盤偵聽。當更多的屬性添加到計算機(如3塊RAM)時,爲該計算機返回的行數變得非常大,並且它使得必須將結果排序在應用程序代碼中。 我可以以某種方式進行查詢,將兩個返回的行分組在一起?或者在第二行的h_name列中返回NULL的查詢,以便返回的所有值都是唯一的?
編輯: 我想回是這樣的:
ID | P_ID | P_NAME | H_ID | H_NAME |
-----------------------------------------------------------
13 | 27 | PROCESSOR TYPE 1 | 35 | HARDDRIVE TYPE 25 |
13 | 28 | PROCESSOR TYPE 2 | 35 | NULL |
14 | 27 | PROCESSOR TYPE 1 | NULL | NULL |
或者任何結果可以很容易地把它變成一個數組這樣
[13] =>
[P_NAME] =>
[0] => PROCESSOR TYPE 1
[1] => PROCESSOR TYPE 2
[H_NAME] =>
[0] => HARDDRIVE TYPE 25
[14] =>
[P_NAME] =>
[0] => PROCESSOR TYPE 1
你怎麼連接電腦,處理器和磁碟機表,因爲我沒有看到任何公共列 – AnandPhadke
你能展示你想要得到的最終結果嗎? –