0

データベースには、プロジェクトがあります。各プロジェクトにはファイルがあります。各ファイルには複数のバージョンがあります。

理論的には、これを行うことができます(疑似)。

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

出力は次のとおりです。

ex2

しかし、結合された行には多くの重複データがあり、データベース内のものが変更された場合にコードを一度更新するのは確かに多くの作業であるため、これを行うことでパフォーマンスが向上するかどうかはわかりません。

要するに推測します。これは、私がそこにあると信じている適切な解決策に対する汚い回避策のように感じます。

これに対するより良い解決策はありますか?

4

1 に答える 1

3

MySQLデータベースから構造化データを直接返す方法はありません。これらのテーブル指向のデータを配列に変換するあなたの努力は正しいです。

PHP dibiライブラリを見てください。これは、必要なすべてを素晴らしく短い構文で実行するメソッド->fetchAssoc()doc )です。

于 2012-06-08T12:15:21.767 に答える