我试图找出一个脚本来获取 MySQL 查询并将其转换为单独的查询,即动态非规范化查询。
作为测试,我构建了一个包含 4 个表的简单文章系统:
- 文章
- article_id
- article_format_id
- 文章标题
- 文章正文
- 文章日期
- article_categories
- article_id
- 类别ID
- 类别
- 类别ID
- 类别标题
- 格式
- format_id
- 格式标题
一篇文章可以属于多个类别,但只有一种格式。我觉得这是现实生活中的一个很好的例子。
在列出所有文章的类别页面上(也拉入 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解析查询,该查询在将查询拆分为多维数组时效果很好,但解决上述问题令人头疼。
任何帮助或建议将不胜感激。