PHP / MySQL从表中排序/排列

时间:2012-07-09 23:00:53

标签: php mysql mysqli

我开始学习一些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>

由于

2 个答案:

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

你可以在这个指令上使用其他参数,产生不同的结果,选择最适合你的那个。