我有一个tracklists
表,其中包含跟踪列表的 id ,名称和 description 以及tracks
表包含 id , name 和 tracklist_id 的曲目。
现在假设我要显示一个HTML表格,其中每行显示一个跟踪列表,如下所示:
我想在单个数据库请求中执行此操作(使用PDO),但我很难搞清楚:
foreach
)为每个专辑创建一个(HTML)表格行,同时包含相关的曲目列表。首先,我尝试不使用 join 请求并简单地创建一个输出轨道列表的函数,如下所示:
function listTracks($id) {
$pdo = dbConnect();
$request = "SELECT * FROM tracks AS track WHERE album_id = :id";
$stmt = $pdo->prepare($request);
$variables = array('id' => $id);
$result = $stmt->execute($variables);
$tracks = $stmt->fetchAll();
$trackList = "";
foreach ($tracks as $track) {
$trackList .= "<li>" . $track["name"] . "</li>";
}
return $trackList;
}
我注意到制作新的数据库请求以获取每个跟踪列表的轨道的速度很慢,这就是我尝试使用这样的请求加入解决方案的原因:
$request = "SELECT tracks.name, tracklists.*
FROM tracklists
INNER JOIN tracks
ON tracklists.id = tracks.album_id";
问题是这个请求返回一个数组,我不明白我应该按照我想要的方式显示它(我总是最终为每个轨道而不是每个轨道列表创建一个表行。)
答案 0 :(得分:1)
MySQL Query以获取所有专辑和曲目列表
function listTracks(){
$ sql =&#34; SELECT tkl.id,tkl.name,description,
GROUP_CONCAT(DISTINCT tk.name SEPARATOR&#39;
&#39;)tracklist
来自跟踪列表tkl LEFT OUTER JOIN跟踪tk
ON tk.tracklist_id = tkl.id GROUP BY tkl.id ORDER BY tkl.id DESC&#34;;
convert circles.svg result.png
如果要为查询提供相册ID
$stmt = $pdo->prepare($sql);
$stmt->execute();
$result = $stmt->fetchAll(PDO::FETCH_ASSOC);
$list = "";
foreach($result as $tracks => $track){
$list .= "<li>".$track['name']."</li>
<li>".$track['description']."</li>
<li>". $track['tracklist'] ."</li>";
}
return $list;
}