我有2张桌子。一张桌子是'标题'和包含标题,另一个是“小标题”,包含(并且必须)在标题下分类并且必须具有相应标题的子标题。子标题只能有一个标题,许多子标题可以具有相同的标题。请考虑以下格式:
--Table heading
heading_id heading
1 H1
2 H2
3 H3
--Table sub_heading
sub_head_id sub_heading heading_id
1 SH1 1
2 SH2 1
3 SH3 2
4 SH4 3
5 SH5 2
6 SH6 4
我想要做的只是查询数据库一次并获取所有sub_headings及其相应的标题(使用Inner Join?)并仅输出一次Heading并列出其各自Heading下列出的所有sub_headings。所以,在实践中,我想显示 OUTPUT RESULT AS :
H1
--SH1
--SH2
H2
--SH3
--SH5
H3
--SH4
H4
--SH6
正如你所看到的,标题只有一次回响,所有属于标题的小标题都在各自的标题下很好地显示出来。所以我想知道我会写什么查询来这样做。
注意:我已经编写了一个代码来获取heading_id,并在循环中执行此操作,查询数据库中的相应子标题。这再次导致sub_headings的循环。但是(我觉得)这样做的缺点是,对于每个存在的标题,DB将至少被查询一次以获得相应的sub_headings。因此,如果存在50个标题,则在循环中获取它们时,将执行第二个查询以获取子标题。这需要我写下第二个查询来获取子标题并在循环中处理它们。我想避免这种情况。
因此,如果有人能告诉我如何仅查询数据库一次并输出结果(如上所述),那将会非常有帮助。提前谢谢。
答案 0 :(得分:3)
select *
from heading h, subheading s
where s.h = h.id
order by h.title, s.title
循环结果,当heading_id改变时,输出一个新的部分
答案 1 :(得分:3)
$query = "SELECT
h.heading,
s.sub_heading
FROM
heading h
LEFT JOIN
sub_heading s
ON
h.id = s.heading_id
ORDER BY
s.heading_id ASC,
s.sub_head_id ASC";
$resource = mysql_query($query);
$previous_heading = false;
// This will print the headings in a unordered list, modify if needed
echo '<ul>';
while($resource = mysql_fetch_assoc($resource)) {
if(!$previous_heading || $previous_heading != $resource['heading']) {
if($previous_heading) {
echo '</ul></li>';
}
echo '<li>'.$resource['heading'].'<ul>';
}
echo '<li>'.$resource['sub_heading'].'</li>';
$previous_heading = $resource['heading'];
}
echo '</ul></ul>';
将输出类似
的内容