0

假设,我的数据库中有以下表格。

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
  1. POSTS从表中选择所有所需的帖子。
  2. 使用 Foreach 循环显示每个帖子。
  3. 在 foreach 循环中,我使用另一个 SELECT 语句RELATION通过匹配POSTS.id.
  4. 然后,我使用另一个 foreach 循环来显示所有类别。

但是,由于表中只有类别 ID,因此RELATION我需要显示类别的名称。

  1. 因此,我使用另一个 SELECT 语句从CATEGORIES表中获取类别的名称,方法是使用RELATION.cat_id.

代码运行良好,我得到了我想要的。但是,我觉得有很多 mysql 请求正在生成。因此,服务器上的负载会增加。

所以,我需要知道我在做什么是对还是错。或者,如果有更简单的方法来完成这一切?

4

1 回答 1

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 子句。这根本不会随着数据库的增长而扩展。

于 2013-03-17T18:43:39.610 回答