PHP只重复一次重复行

时间:2010-01-01 19:37:56

标签: php mysql

我有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个标题,则在循环中获取它们时,将执行第二个查询以获取子标题。这需要我写下第二个查询来获取子标题并在循环中处理它们。我想避免这种情况。

因此,如果有人能告诉我如何仅查询数据库一次并输出结果(如上所述),那将会非常有帮助。提前谢谢。

2 个答案:

答案 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>';

将输出类似

的内容
  • H1
    • SH1
    • SH2
  • H2
    • SH3
    • SH5
  • H3
    • SH4
  • H4
    • SH6