0

我开始学习一些 PHP/Mysql 并且我正在努力如何使它工作。

我有 2 张桌子。一个叫 ALBUM,另一个 TRACKS 在 ALBUM 上我有我需要的所有专辑信息(标题、发行日期、封面),在 TRACKS 上我有所有曲目名称和专辑 ID。

我可以使 SELECT 正常工作并获取所有内容,但是如何按专辑名称过滤并显示与该专辑相关的所有曲目?

现在我有这个

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>";

另请注意,我只在一个循环中完成所有操作,现在您正在使用两个循环(一个用于从数据库中检索行,另一个用于显示结果)。我在一个循环中完成所有事情,这将提高您的应用程序的性能。

如果您需要进一步的帮助,请告诉我。联邦快递

于 2012-07-11T01:12:29.360 回答
0

您将不得不使用 GROUP BY 指令。

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 回答