【问题标题】:db queries inside loop循环内的数据库查询
【发布时间】:2011-11-12 07:32:23
【问题描述】:

我有一个关于 foreach 循环内的数据库查询的问题。我正在为网站上的用户制作留言簿。我将“user_id”、“owner_id”、“message”存储在数据库表“guestbook”中。并遍历它们以在页面上显示帖子。但是在那个循环中,我通过直接调用 whois_model 来获得“用户”表中的“用户名”,其中 id = user_id。

<?php foreach ($records as $record) : ?>
From: <?=anchor('profile/view/' . $record->user_id . '', $this->whois_model->_whois($record->user_id)); ?>

<p><?=$record->message; ?></p>
<?php endforeach; ?>

将用户名直接存储在留言簿表中更好,还是有更好的方法来避免运行多个查询?

提前致谢

乔治

【问题讨论】:

    标签: php mysql codeigniter


    【解决方案1】:

    除非有充分的理由,否则不要对数据进行非规范化。不仅浪费空间,而且如果您的 records 表中还有用户名列,那么当用户更改名称时会发生什么?

    更好的方法是让您的模型或控制器在您计划使用时自动检索用户名。这可以使用连接来完成,例如:

    $this->db->select('username, message');
    $this->db->from('guestbook');
    $this->db->join('users', 'guestbook.user_id = users.user_id');
    
    $query = $this->db->get();
    

    请记住,视图应该只用于显示信息;您不必在视图中从数据库中获取任何内容(例如:通过另一个模型)。

    【讨论】:

    • 哦,当然!加入!不知道为什么我没有想到:/感谢大家的帮助。你首先被选为你的解决方案。谢谢大家:)
    【解决方案2】:

    可以将用户名存储在单独的表中,您可以使用 JOIN 在同一查询中获取实际用户名,而无需运行多个。

    例如:

    SELECT `messages`.`user_id`, `messages`.`owner_id`, `messages`.`message`, `users`.`username` FROM `messages`
    INNER JOIN `users` ON (messages.user_id = users.id)
    WHERE (clause)
    ORDER BY (clause)
    

    有关更多信息和示例,请参阅join

    【讨论】:

      【解决方案3】:

      您不应将用户名存储在留言簿表中。相反,当您查询留言簿条目时,请在 user_id 上加入用户表(支持您的 whois 模型的任何表),以便您在单个查询中获取留言簿中的所有信息和用户名。在您的查询中检索记录是这样的:

       ...
       $this->db->select('*');
       $this->db->from('guestbook');
       $this->db->join('users', 'users.user_id = guestbook.user_id');
       ...
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-09-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-09-08
        相关资源
        最近更新 更多