Php MySQL:用于多行结果的标准方法与基于集合的方法

Php MySQL:用于多行结果的标准方法与基于集合的方法,php,mysql,sql,recursive-query,set-based,Php,Mysql,Sql,Recursive Query,Set Based,接下来,在下面的例子中,标准方法或递归方法存在问题 例如,我希望返回具有相同父\u id的页面,并且某些页面具有多行内容 页表 内容表 内容结构表 标准方法 SELECT p.*, c.*, x.* FROM pages AS p LEFT JOIN pages_structures AS x ON x.page_id = p.page_id LEFT JOIN pages_contents AS c ON c.content_id = x.content_id

接下来,在下面的例子中,标准方法或递归方法存在问题

例如,我希望返回具有相同父\u id的页面,并且某些页面具有多行内容

页表

内容表

内容结构表

标准方法

SELECT 
    p.*,
    c.*,
    x.*

FROM pages AS p

LEFT JOIN pages_structures AS x
ON x.page_id = p.page_id

LEFT JOIN  pages_contents AS c
ON c.content_id = x.content_id

WHERE p.parent_id = '1'
AND p.page_id  != '1'
结果它将行列为4项

page_id   page_title  parent_id   content_text    order_in_page
2         aa           1          text one aa        1    
2         aa           1          text two aa        2
3         ab           1          text one ab        1
4         ac           1          text one ac        1        
正如您所注意到的,有两行的page_id为2,3和4各有一行。如何使用标准方法将数据显示为HTML格式,如前一部分答案中所建议的那样,如下所示

但是如果是基于集合的,我可以用这个

SELECT
   page_id,
   page_title, 
   MAX(IF(order_in_page = 1, content_text, NULL)) AS content_1,
   MAX(IF(order_in_page = 2, content_text, NULL)) AS content_2,
   .
   .
   .
FROM 
   pages AS p LEFT JOIN 
   pages_structures AS x ON x.page_id = p.page_id LEFT JOIN  
   pages_contents AS c ON c.content_id = x.content_id
WHERE
   p.parent_id = '1'
AND
   p.page_id != '1'
GROUP BY page_id
在PHP中

foreach($items as $item)
{
    echo '<li><h3>'.$item['page_title'].'</h3>';
    echo '<p>'.$item['content_1'].'</p>';
    echo '<p>'.$item['content_2'].'</p></li>';
}
HTML将行列为3项,这是正确的

<li>
   <h3>aa</h3>
   <p>text one aa</p>
   <p>text two aa</p>
</li>

<li>
   <h3>ab</h3>
   <p>text one ab</p>
   <p></p>
</li>

<li>
   <h3>ac</h3>
   <p>text one ac</p>
   <p></p>
</li>

希望这有意义

使用标准方法,您只需在变量中跟踪当前页面,当页面更改时,您可以滚动到新的列表项。

使用标准方法,您只需在变量中跟踪当前页面,当页面更改时,您可以滚动到新的列表项

echo $page[0]['page_title'];
echo $page[0]['content_text'];
SELECT
   page_id,
   page_title, 
   MAX(IF(order_in_page = 1, content_text, NULL)) AS content_1,
   MAX(IF(order_in_page = 2, content_text, NULL)) AS content_2,
   .
   .
   .
FROM 
   pages AS p LEFT JOIN 
   pages_structures AS x ON x.page_id = p.page_id LEFT JOIN  
   pages_contents AS c ON c.content_id = x.content_id
WHERE
   p.parent_id = '1'
AND
   p.page_id != '1'
GROUP BY page_id
foreach($items as $item)
{
    echo '<li><h3>'.$item['page_title'].'</h3>';
    echo '<p>'.$item['content_1'].'</p>';
    echo '<p>'.$item['content_2'].'</p></li>';
}
<li>
   <h3>aa</h3>
   <p>text one aa</p>
   <p>text two aa</p>
</li>

<li>
   <h3>ab</h3>
   <p>text one ab</p>
   <p></p>
</li>

<li>
   <h3>ac</h3>
   <p>text one ac</p>
   <p></p>
</li>