我有一个用户表:
USERS:
ID | NAME |
----------------
1 | JOHN |
2 | STEVE |
电脑桌:
COMPUTERS:
ID | USER_ID |
------------------
13 | 1 |
14 | 1 |
处理器表:
PROCESSORS:
ID | NAME |
---------------------------
27 | PROCESSOR TYPE 1 |
28 | PROCESSOR TYPE 2 |
和一张硬盘表:
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 |
因此,ID 为 1 的用户 JOHN 拥有计算机 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