0

PHP/Mysql の学習を始めていますが、これを機能させるにはどうすればよいか苦労しています。

私は2つのテーブルを持っています。1 つは ALBUM と呼ばれ、もう 1 つは TRACKS です。ALBUM には必要なすべてのアルバム情報 (タイトル、リリース日、カバー) があり、TRACKS にはすべてのトラック名と関連するアルバム ID があります。

SELECT を正常に機能させてすべてのコンテンツを取得することはできますが、たとえば ALBUM 名でフィルタリングして、そのアルバムに関連するすべてのトラックを表示するにはどうすればよいでしょうか?

今、私はこれを持っています

define("MYSQLUSER", "root");
define("MYSQLPASS", "root");
define("HOSTNAME", "localhost");
define("MYSQLDB", "music");

$connection = new mysqli(HOSTNAME, MYSQLUSER, MYSQLPASS, MYSQLDB);

if ($connection->connect_error) {
  die('Could not connect: ' . $connection->connect_error);
}else{

$query = "SELECT * from album AS a JOIN tracks AS t ON t.album = a.id ORDER BY a.id,  t.trackNumber, t.album";

$result_obj = '';
$result_obj = $connection->query($query);

while($result = $result_obj->fetch_array(MYSQLI_ASSOC)){
  $items[] = $result;
}


 foreach ($items as $item){
  echo "<ul><li>";
  echo $item['name'];
  echo " - "
  echo $item['file'];
  echo "</li></ul>";
} 

問題は、すべてのアルバム/トラックを互いに別々に出力することです。

このような:

<ul>
<li>Album 1 - file 1</li>
</ul>

<ul>
<li>Album 1 - file 2</li>
</ul>

<ul>
<li>Album 2 - file 1</li>
</ul>

同じ ul/li タグでアルバムを作成するにはどうすればよいですか? 私は自分の foreach ループを知っています。しかし、私に何ができるでしょうか?

したがって、次のようになります。

<ul>
<li>Album 1 - file 1, Album 1 - file 2, Album 1 - file3</li>
<li>Album 2 - file 1</li>
</ul>

ありがとう

4

2 に答える 2

1

クエリをそのままにして、次のようにループを改善することができます。

echo "<ul>";
$first = true;
$previous_album = '';
while($result = $result_obj->fetch_array(MYSQLI_ASSOC)){
    if( $previous_album!=$result['album'] ){
        $previous_album = $result['album'];
        if( !$first ){
            echo "</li>";
        }else{
            $first = false;
        }
        echo "<li>";
    }else{
        echo ", ";
    }
    echo $result['name'];
    echo " - ";
    echo $result['file'];
}
echo "</li></ul>";

また、私はすべてを 1 つのループだけで行っていることに注意してください。現在、2 つのループを使用しています (1 つは DB から行を取得するため、もう 1 つは結果を表示するため)。すべてを 1 つのループで実行しているため、アプリのパフォーマンスが向上します。

さらにサポートが必要な場合はお知らせください。フェデックス

于 2012-07-11T01:12:29.360 に答える
0

GROUPBYディレクティブを使用する必要があります。

SELECT * from album AS a JOIN tracks AS t ON t.album = a.id GROUP BY a.id ORDER BY a.id,  t.trackNumber, t.album

このディレクティブで他のパラメーターを使用して、異なる結果を生成し、自分に最適なパラメーターを選択することができます。

于 2012-07-09T23:06:59.727 に答える