我有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个标题,则在循环中获取它们时,将执行第二个查询以获取子标题.这需要我写下第二个查询来获取子标题并在循环中处理它们.我想避免这种情况.
因此,如果有人能告诉我如何仅查询数据库一次并输出结果,那将非常有帮助,如上所述.提前致谢.
解决方法:
$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>';
会输出类似的东西
> H1
> SH1
> SH2
> H2
> SH3
> SH5
> H3
> SH4
> H4
> SH6
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。