2011-12-20 1 views
3

自分のサイトのディレクトリリストページを作りたいと思います。このページには、すべての自分のサイトの記事が表示されます。そして、これらの記事はタイトルの最初の手紙でグループ化されます。ディレクトリリストのページグループで26回mysqlクエリをA-Zで行う必要がありますか?

は私が

mysql query like "SELECT * FROM articles Where title like 'a%'" 
mysql query like "SELECT * FROM articles Where title like 'b%'" 
mysql query like "SELECT * FROM articles Where title like 'c%'" 
... 
mysql query like "SELECT * FROM articles Where title like 'z%'" 

そして、私のHTML出力のように26回mysqlのクエリを実行する必要があります:

<div class="content"> 
    <p>A</p> 
    <a href="somelink">Anhui</a> 
    <a href="somelink">Aomen</a> 
</div> 
<div class="content"> 
    <p>B</p> 
    <a href="somelink">Beijing</a> 
</div> 
<div class="content"> 
    <p>C</p> 
    <a href="somelink">Chongqing</a> 
</div> 
... 
<div class="content"> 
    <p>Z</p> 
    <a href="somelink">Zhejiang</a> 
</div> 

だから私はあまりMySQLのクエリを実行し、同じ結果を得るものとし、何か良いアドバイスがあります?ありがとう。

+3

ORDER BYのタイトルからSELECT *を実行して、結果セットを読み込んでいるforループのtitleの最初の文字を変更するのはなぜですか? –

+0

@マーク・ベイカー:私のばかげたことに対して、私はまだ、「A」、「B」、「C」、「D」を1つのforeachでカットする方法を推測しません... –

答えて

9

号はそうのように、単一のクエリを作成し、アルファベット順に順番にそれらを:

SELECT * FROM articles ORDER BY title ASC 

次に、それらを表示するためにそれらを介して、あなたループとして、あなたが示した最後の記事を追跡します。現在の記事の最初の文字が最後の文字と異なる場合は、分けてください。 FirstLetterが 'B' から 'A' からスイッチまで

$prevFirstLetter = ''; 
while($data = nextResult()) { 
    $firstLetter = substr($data['title'], 0, 1); 
    if ($firstLetter != $prevFirstLetter) 
     echo "<h1>$firstLetter</h1>"; 
    echo "{$data['title']}<br>"; 
    $prevFirstLetter = $firstLetter; 
} 
2

新しいコンテンツのdivを作成し、それが変更された場合($string[0]を使用してアクセス可能)最初の文字を追跡し、あなたがループしているとき、あなたが次に

SELECT * FROM `articles` ORDER BY `title` 

を試してみたを教えてください。

0

私は1つのクエリを実行し、ソートされた順序でそれらを返すようにして、コードに入ったら分割します。 1がそのトリックをするときに26のクエリを行うのは愚かなようだ。

0

すべてを1つのクエリで選択し、タイトル名で並べ替えることができます。その後、PHPコードでは、最初の手紙に変更があったときはいつでもレコードセットを分割するロジックが必要です。

2

あなたはFirstLetter列

ため

SELECT *,LEFT(title,1) FirstLetter FROM articles ORDER BY title ASC 

チェックこのクエリをループただ何度も何度も<a href="somelink">' . $title . </a>を書くことができます。

関連する問題