如何在一个页面中防止多个SQL查询?

时间:2016-02-23 16:35:36

标签: php mysql sql performance mysqli

我有一个这样的数据库表:

公司

enter image description here

在我的ındex页面中,我有3个模块。

  1. 黄金公司(gold.php)

    $db->where('gold','1');
    $company = $db->get('company');
    foreach ($company as $gold)
      { 
       echo $gold['name'] ;
      }
    
  2. 公司按日期排序(最后添加)(last.php)

    $db->orderby('date','desc');
    $company = $db->get('company');
    foreach ($company as $date)
      { 
       echo $date['name'] ;
      }
    
  3. 在线公司(online.php)

    $db->where('online','1');
    $company = $db->get('company');
    foreach ($company as $online)
      { 
       echo $online['name'] ;
      }
    
  4. 这是我的索引页

         include ( "gold.php" );
         include ( "last.php" );
         include ( "online.php" );
    

    我的问题: 一页有3个模块,一页有3个查询。为了获得最佳的mysql性能,我该如何使用这些查询?我是否只能对所有这些模块使用一个查询。

3 个答案:

答案 0 :(得分:1)

您提出了3个不同的问题:

  1. 所有自然顺序为黄金的公司
  2. 所有公司的日期顺序
  3. 所有以自然顺序在线的公司
  4. 这是3个不同的问题。您必须在订购方面达成妥协 -

    你可以问:

    取出所有黄金或在线公司(WHERE gold = 1 OR online = 1)

    这将按照黄金公司和在线公司(以及黄金在线公司)的自然顺序取回合并清单。

    您可以解析结果,因为您输出的结果是将黄金公司分散到一个列表中,然后将其联机到另一个列表中,但是如何处理黄金在线公司 - 目前它们都列在两个列表中)

    现在开始觉得有点乱。让我们以另一种方式来思考......

    你已经要求取回所有公司了,请问一个问题。现在,当您解析结果时,您将黄金公司吐入黄金名单,在线公司进入在线列表以及所有公司列表中的所有公司)

    唯一的区别是您的黄金和在线列表将按日期排序。这可以接受吗?

    tbh,只要您的黄金和在线列被编入索引并且结果很小或被分页,这三个查询的开销应该可以忽略不计,并且可以更容易地读取代码/模块化代码。

答案 1 :(得分:0)

您可以使用此查询:

    SELECT name, online, gold
      FROM company
     ORDER BY date

然后在你的PHP代码中循环结果(假设你的变量名称):
1.仅在$gold['gold'] == 1时显示 没什么可改变的 1.仅在$online['online'] == 1

时显示

答案 2 :(得分:0)

如果不清楚地了解网页的人体工程学,就很难回答。

如果您预先加载所有内容(因为您需要预先安装所有内容),那么我将只使用一个查询创建对象池,因为要加载的对象数量是合理的(似乎是您的情况)

如果用户逐步加载内容,则值得在前端和后端插入一些ajax端点,这样您就可以根据需要随时检索数据。