如何在mysql表中为每个父项显示子项

时间:2012-12-27 21:07:38

标签: php mysql sql

如何创建一个查询,显示每个父项及其子项,而不是先显示所有父项,然后显示子项。例如,现在,mySQL表显示所有COMPUTERS然后显示DRIVES。我希望它为每台计算机显示,显示与该计算机关联的驱动器。 I.E。:

 COMPUTER   DRIVE        PID         ID 
 dell                    1 
 apple                   2
 apple                   3
 hp                      4
 hp                      5
            WD300FV                  1
            WD440GB                  1
            WD55                     2
            WD44X                    2...

我希望它显示为每个计算机都显示其驱动器列表:

 COMPUTER   DRIVE        PID     
 dell                    1 
            WD300FV      1
            WD440GB      1
 apple                   2
            WD55         2
            WD44X        2
 apple                   3.....

计算机具有父ID且驱动器具有ID。

当我执行此查询SELECT * FROM table时,它不会创建我希望显示的行。我希望显示计算机的每一行都显示计算机行下方的驱动器列表。

2 个答案:

答案 0 :(得分:1)

我会质疑你的表结构。我认为计算机和驱动器应该在两个独立但相关的表中,因为它们是两个不同的东西,可能有它们自己的属性。

电脑桌:

computer_id |  manufacturer
---------------------------
1           |  dell
2           |  apple
3           |  hp

computer_id将自动递增主键

驱动器表:

drive_id   |  computer_id  |  name
-----------------------------------
1          |  1            | WD300FV
2          |  1            | WD440GB
3          |  2            | WD55
4          |  2            | WD44X
5          |  3            | XYZ

drive_id将自动递增主键

computer_id会有索引(如果你使用的是InnoDB并希望强制建立与计算机表的关系,可能还有外键约束)

然后你会这样查询:

SELECT c.computer_id, c.manufacturer, d.drive_id, d.name
FROM computer AS c
INNER JOIN drive AS d ON c.computer_id = d.computer_id
ORDER BY c.computer_id ASC, d.drive_id ASC

如果出于某种原因,你不想像我提出的那样使用标准化结构,而是使用类似于你已经拥有的非规范化结构,你至少应该考虑进行去标准化以更加理智的方式。如果您只是按照以下方式构建表格,则根本不需要pid逻辑:

computer  |  drive
------------------
dell      | WD300FV
dell      | WD4440GB
apple     | WD55
apple     | WD44X
hp        | XYZ

您只是添加了一个不需要存在的复杂程度。您可以通过“计算机”轻松地对结果进行排序:

SELECT computer, drive FROM table
ORDER BY computer ASC, drive ASC

根本没有架构更改,您可以像这样查询:

SELECT computer, drive, CASE WHEN pid = '' THEN id ELSE pid END as `sort_id`
FROM table
ORDER BY `sort_id` ASC, drive ASC

答案 1 :(得分:0)

要按所需顺序获取行,可以使用:

select
  computer,
  drive,
  coalesce(pid, id)
from
  your_table
order by
  coalesce(pid, id), computer is null, drive is not null

这将按pid或(pid为空)按id排序行,并将行放在计算机不为空的行顶部(因为computer is null是当它为假时评估为0,当它为真时评估为1),然后在顶部评估驱动为空的行。

(当然,如果计算机和驱动器不能同时为空,您只需按computer is null订购)

您也可以考虑这个顺序条款:

order by coalesce(pid, id), computer is null, computer, drive is not null, drive