0

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

 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时,它不会像我希望的那样创建行。我希望显示计算机的每一行都在计算机行下方显示驱动器列表。

4

2 回答 2

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
于 2012-12-27T21:25:07.260 回答
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),然后将驱动器为空的行放在顶部.

(当然,如果计算机和驱动不能同时为空,你可以通过 just 来订购computer is null

你也可以考虑这个 order by 子句:

order by coalesce(pid, id), computer is null, computer, drive is not null, drive
于 2012-12-27T22:36:41.390 回答