微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

PHP只重复一次重复行

我有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 举报,一经查实,本站将立刻删除。

相关推荐