データベースには、プロジェクトがあります。各プロジェクトにはファイルがあります。各ファイルには複数のバージョンがあります。
理論的には、これを行うことができます(疑似)。
$res = mysql_query("SELECT * FROM projects");
while($row=mysql_fetch_assoc($res))
{
echo "Project ".$row["id"]."<br/>";
$res2 = mysql_query("SELECT * FROM projectfiles");
while($row2=mysql_fetch_assoc($res2))
{
echo "FileID ".$row2["id"]."<br/>";
$res3 = mysql_query("SELECT * FROM fileversions");
while($row3=mysql_fetch_assoc($res3))
{
echo $row3["name"]."<br/>";
}
echo "<br/>";
}
}
出力例:
Project 1
FileID 1
test_file_1.txt.1
FileID 2
test_file_2.txt.1
FileID 3
test_file_3.txt.1
test_file_3.txt.2
しかし、これは 1 つだけが必要な mysql クエリのロードとロードを意味します。
だから私はクエリに参加します:
$sql = "SELECT projectfiles.*, fileversions.*,
projects.id as projects_id
FROM projects";
$sql .= " LEFT JOIN".
" (SELECT
projectfiles.id as projectfiles_id,
projectfiles.fileID as projectfiles_fileID,
projectfiles.projectID as projectfiles_projectID
FROM projectfiles
) AS projectfiles".
" ON projects.id = projectfiles_projectID";
$sql .= " LEFT JOIN".
" (SELECT
fileversions.id as fileversions_id,
fileversions.name as fileversions_name,
fileversions.location as fileversions_location,
fileversions.fileID as fileversions_fileID
FROM fileversions
) AS fileversions".
" ON projectfiles.projectfiles_fileID = fileversions_fileID";
しかし、これはもちろん、構造化されていないデータを残します。
だから私がしたことは:
while($row = mysql_fetch_assoc($res))
{
$projectID = $row["projects_id"];
$fileID = $row["projectfiles_fileID"];
$fileversionID = $row["fileversions_id"];
$fileversionsArray[$fileversionID] = array($row["fileversions_name"],$row["fileversions_location"]);
$fileArray[$fileID][$fileversionID] = $fileversionID;
$projectArray[$projectID][$fileID] = $fileID;
}
だから私はそれを次のように示すことができます:
foreach($projectArray as $projectID => $projectDatas)
{
echo "Project ID: ".$projectID."\n";
foreach($projectDatas as $fileID)
{
echo "\tFile ID: ".$fileID."\n";
foreach($fileArray[$fileID] as $fileversionID)
{
echo "\t\tFile version name: ";
echo $fileversionsArray[$fileversionID][0];
echo "\n";
echo "\t\tFile location: ";
echo $fileversionsArray[$fileversionID][2];
echo "\n";
}
}
}
出力は次のとおりです。
しかし、結合された行には多くの重複データがあり、データベース内のものが変更された場合にコードを一度更新するのは確かに多くの作業であるため、これを行うことでパフォーマンスが向上するかどうかはわかりません。
要するに推測します。これは、私がそこにあると信じている適切な解決策に対する汚い回避策のように感じます。
これに対するより良い解決策はありますか?