0

私がこのようなデータベース設計をしているとしましょう:

データの場合:

id |    title     | category
1  | first title  | 1
2  | second title | 4
3  | third title  | 5
4  | fourth title | 2
5  | fifth title  | 3
6  | other title  | 1

およびカテゴリの場合:

id | name 
1  | music 
2  | movies
3  | funny 
4  | people 
5  | sport 

各カテゴリのリストとそのカテゴリのアイテムタイトルを出力するにはどうすればよいですか?

次のように考えてください:

<div>
<h1>music</h1>
<div>first title</div>
<div>other title</div>
<div>

<div>
<h1>movies</h1>
<div>fourth title</div>
<div>

// and so on...

このような結果のmysqlクエリを作成する方法がわかりません...

誰か教えてもらえますか?(例が簡単に理解できることを願っています)

前もって感謝します。

編集:私はEugen Rieckのコードを使用しましたが、次のことを行う方法がわかりません

で注文し、同時に最終的にwhere条件を使用するにはどうすればよいcategories.idですtitles.idか?

このようなもの: ORDER BY titles.id DESC LIMIT 0, 10 WHERE titles.views > 10

4

2 に答える 2

2

titles最初のテーブルが呼び出され、2 番目のテーブルが呼び出されたと仮定すると、次categoriesのようなクエリを使用します

SELECT categories.name as cat, tiltes.title as title
FROM categories INNER JOIN titles ON titles.category=categories.id
ORDER BY categories.id

次に、グループ変更ループを実行します

define('MAX_TITLES_PER_CAT',10);

$cat='';
$tcount=0;
while (true) {
  //Fetch a row depending on your DB framework, eg. mysql_fetch_row()
  if ($row['cat']!=$cat) {
    if ($cat!='') echo '</div>';
    $cat=$row['cat'];
    $tcount=MAX_TITLES_PER_CAT;
    echo "<div><h1>$cat</h1>";
  }
  if ($tcount--<=0) continue;
  echo '<div>'.$row['title'].'</div>';
}
if ($cat!='') echo '</div>';

編集

上記のコードを更新して、カテゴリごとに表示されるタイトルの数を制限しました。MAX_TITLES_PER_CATカテゴリごとのタイトルの平均数が よりはるかに多い場合、これは非常に非効率的であることを理解してくださいMAX_TITLES_PER_CAT

于 2012-06-21T11:59:58.513 に答える
1
SELECT
    t.title,
    c.name
FROM
    titles t
INNER JOIN categories c
    ON c.id = t.category
ORDER BY
    c.name
ASC

これにより、カテゴリ別に並べられたすべてのタイトルのリストが表示されます。PHPで行うことは、おおよそ次のとおりです。

$prevCategory = null;

while(fetchRows)
{
    $newCategory = $row['name'];

    if($prevCategory != $newCategory)
    {
        echo '<ul>{category name}</ul>';
    }

    echo '<li>{title}</li>';

    $prevCategory = {category name};

}

これは半疑似コードであることに注意してください。以前の UL を閉じておらず、求めている HTML 形式に従っていません。ただし、これでうまくいくはずです。

于 2012-06-21T11:56:18.687 に答える