实现Mult的更好方法。 PHP中的1个帖子的类别?

时间:2013-03-17 18:20:20

标签: php mysql sql database-design

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

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语句通过匹配RELATIONPOSTS.id表中获取类别。
  4. 然后,我使用另一个foreach循环来显示所有类别。
  5. 但是,因为我在RELATION表中只有类别ID,所以我需要显示类别的名称。

    1. 因此,我使用另一个SELECT语句通过CATEGORIESRELATION.cat_id表中获取类别的名称。
    2. 代码工作得很好,我得到了我想要的东西。但是,我觉得有很多mysql请求正在生成。因此,服务器上的负载会增加。

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

1 个答案:

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