我开始学习一些PHP / Mysql,我很震惊,我怎么能做到这一点。
我有2张桌子。一个叫做ALBUM,另一个是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>
由于
答案 0 :(得分: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>";
另请注意,我只在一个循环中执行所有操作,现在您正在使用两个循环(一个用于从DB检索行,另一个用于显示结果)。我只在一个循环中完成所有操作,这将提高应用程序的性能。
如果您需要进一步的帮助,请告诉我。联邦快递
答案 1 :(得分: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
你可以在这个指令上使用其他参数,产生不同的结果,选择最适合你的那个。