如何创建一个查询,显示每个父项及其子项,而不是先显示所有父项,然后显示子项。例如,现在,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
时,它不会创建我希望显示的行。我希望显示计算机的每一行都显示计算机行下方的驱动器列表。
答案 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