MySQL クエリを取得して個々のクエリに変換するスクリプト、つまりクエリを動的に非正規化するスクリプトを見つけようとしています。
テストとして、4 つのテーブルを持つ単純な記事システムを構築しました。
- 記事
- article_id
- article_format_id
- 記事のタイトル
- article_body
- article_date
- article_categories
- article_id
- カテゴリ ID
- カテゴリー
- カテゴリ ID
- カテゴリ_タイトル
- フォーマット
- format_id
- format_title
記事は複数のカテゴリに属することができますが、フォーマットは 1 つだけです。これは現実の状況の良い例だと思います。
すべての記事を一覧表示するカテゴリ ページ (format_title もプル) では、次のクエリを使用して簡単に実現できます。
SELECT articles.*, formats.format_title
FROM articles
INNER JOIN formats ON articles.article_format_id = formats.format_id
INNER JOIN article_categories ON articles.article_id = article_categories.article_id
WHERE article_categories.category_id = 2
ORDER BY articles.article_date DESC
ただし、作成しようとしているスクリプトは、このクエリを受け取り、解析して、クエリを個別に実行します。
したがって、このカテゴリ ページの例では、スクリプトはこれを効果的に実行します (動的に実行されます)。
// Select article_categories
$sql = "SELECT * FROM article_categories WHERE category_id = 2";
$query = mysql_query($sql);
while ($row_article_categories = mysql_fetch_array($query, MYSQL_ASSOC)) {
// Select articles
$sql2 = "SELECT * FROM articles WHERE article_id = " . $row_article_categories['article_id'];
$query2 = mysql_query($sql2);
while ($row_articles = mysql_fetch_array($query2, MYSQL_ASSOC)) {
// Select formats
$sql3 = "SELECT * FROM formats WHERE format_id = " . $row_articles['article_format_id'];
$query3 = mysql_query($sql3);
$row_formats = mysql_fetch_array($query3, MYSQL_ASSOC);
// Merge articles and formats
$row_articles = array_merge($row_articles, $row_formats);
// Add to array
$out[] = $row_articles;
}
}
// Sort articles by date
foreach ($out as $key => $row) {
$arr[$key] = $row['article_date'];
}
array_multisort($arr, SORT_DESC, $out);
// Output articles - this would not be part of the script obviously it should just return the $out array
foreach ($out as $row) {
echo '<p><a href="article.php?id='.$row['article_id'].'">'.$row['article_title'].'</a> <i>('.$row['format_title'].')</i><br />'.$row['article_body'].'<br /><span class="date">'.date("F jS Y", strtotime($row['article_date'])).'</span></p>';
}
これの課題は、SELECT および JOIN の列名をクエリ内の任意の順序で配置できるため、正しいクエリを正しい順序で実行すること (これは MySQL および他の SQL データベースが非常にうまく変換するものです) と、情報ロジックを実行することです。 PHPで。
私は現在、クエリを多次元配列に分割するのにうまく機能するSQL_Parserを使用してクエリを解析していますが、上記のものを解決することは頭痛の種です。
どんな助けや提案も大歓迎です。