假设我的数据库中有以下表格。
POSTS:
id, title, content
CATEGORIES:
id, name
RELATION:
post_id, cat_id
我已经成功地将值插入到这些表中,同时发布帖子。
我也可以在我的主页上的每个帖子下面显示类别。但是,我担心我使用的方法是非常耗费资源的。
这是我在MySQL / PHP中做的事情。
(您可以选择跳过代码,并阅读其说明以便更好地理解)
//Get all the posts
$database = $connection->prepare("Select * FROM POSTS");
$database->execute(array());
$result = $database->fetchAll(PDO::FETCH_ASSOC);
foreach ($result as $r) {
$articleid = $r['id'];
//Display Post title and other things here
//Get the Category Ids
$database = $connection->prepare("Select * FROM RELATION WHERE post_id = ".$article);
$database->execute(array());
$ret_cat= $database->fetchAll(PDO::FETCH_ASSOC);
//Get names of category, and dislay them
foreach($ret_cat as $rc)
{
$catid = $rc['cat_id'];
$database = $connection->prepare("Select * FROM CATEGORIES WHERE cat_id= ".$catid);
$database->execute(array());
$ret_cat_name= $database->fetch(PDO::FETCH_ASSOC);
echo "<a href='index.php?category=".$rc['cat_id']."'>".$ret_cat_name['name']."</a> ";
}
}//End First ForEach
POSTS
表中选择所有所需帖子。RELATION
从POSTS.id
表中获取类别。但是,因为我在RELATION
表中只有类别ID,所以我需要显示类别的名称。
CATEGORIES
从RELATION.cat_id
表中获取类别的名称。代码工作得很好,我得到了我想要的东西。但是,我觉得有很多mysql请求正在生成。因此,服务器上的负载会增加。
所以,我需要知道我在做什么是对的。或者,如果有更简单的方法可以做到这一切?
答案 0 :(得分:2)
为什么不使用JOIN来减少数据库往返次数?
例如,首先选择所需的帖子......
SELECT * FROM POSTS WHERE <some filter criteria for posts>
...然后为每个返回的行...
SELECT CATEGORIES.*
FROM RELATION JOIN CATEGORIES
ON RELATION.cat_id = CATEGORIES.id
WHERE
post_id = <value from the first query>
甚至可以在一次往返中完成所有事情......
SELECT POSTS.*, cat_id, name
FROM POSTS
JOIN RELATION
ON POSTS.id = RELATION.post_id
JOIN CATEGORIES
ON RELATION.cat_id = CATEGORIES.id
WHERE
<some filter criteria for posts>
...在这种情况下,客户端代码需要“合并”具有相同POSTS.id
的结果行。
Select * FROM POSTS
...没有WHERE子句。随着数据库的增长,这根本不会扩展。