2

この質問に続いて、以下の場合、標準的なアプローチまたは再帰的なアプローチに問題があります。

たとえば、同じページを返したいのですがparent_id、一部のページには複数の行のコンテンツがあり、

pageテーブル

page_id    page_title   parent_id
1          a            1
2          aa           1
3          ab           1
4          ac           1

contentテーブル

content_id   content_text
1            text one
2            text two
3            text one aa
4            text two aa
5            text one ab
6            text one ac

content structureテーブル

page_id     content_id     order_in_page
1           1              1
1           2              2
2           3              1
2           4              2
3           5              1
4           6              1

標準的なアプローチ、

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        

お気づきのように、 と の2 つの行page_id 2とのそれぞれに1 つの行3があり4ます。以下のような標準的なアプローチでデータを HTML に表示するにはどうすればよいですか(前の質問の回答の 1 つに示されているように)。

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

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>

これが理にかなっていることを願っています!

4

1 に答える 1

0

標準的なアプローチでは、変数内の現在のページを追跡するだけで、ページが変更されると、新しいリストアイテムにロールバックします。

于 2012-02-18T02:27:30.303 に答える