代码之家  ›  专栏  ›  技术社区  ›  Ibrahim Azhar Armar

如何将这些巨大的拆分查询转换为单个查询

  •  0
  • Ibrahim Azhar Armar  · 技术社区  · 15 年前

    我在一个页面中从不同的表中获取不同的查询。我想减少数据库的访问量。

    这是我的密码。。

    $query = "SELECT COUNT(*) as cnt_news FROM news";
    $result = mysql_query($query);
    $row = mysql_fetch_array($result);
    
    
    $query = "SELECT COUNT(*) as cnt_adv FROM advertisements";
    $result = mysql_query($query);
    $row = mysql_fetch_array($result);
    
    $query = "SELECT COUNT(*) as cnt_comm FROM comments";
    $result = mysql_query($query);
    $row = mysql_fetch_array($result);
    
    
    $query = "SELECT SUM(CASE WHEN c.approve = '1' AND c.spam = '0' THEN 1 ELSE 0 END) AS cnt_approved,
              SUM(CASE WHEN c.approve = '0' AND c.spam = '0' THEN 1 ELSE 0 END) AS cnt_unapproved,
              SUM(CASE WHEN c.spam = '1' THEN 1 ELSE 0 END) AS cnt_spam
              FROM COMMENTS c";
    $result = mysql_query($query);
    $row = mysql_fetch_array($result);
    
    
    $query = "SELECT SUM(a.amount) as t_amnt,
              SUM(a.cashpaid) as t_cpaid,
              SUM(a.balance) as t_bal
              FROM advertisements a";
    $result = mysql_query($query);
    $row = mysql_fetch_array($result);
    

    谢谢您。

    3 回复  |  直到 15 年前
        1
  •  1
  •   Your Common Sense    15 年前

    您不必削减数据库访问量,但可以通过使用函数削减代码

    做一个通用函数是一个更好的方法。

    <?php
    $num_news = dbgetvar("SELECT COUNT(*) FROM news");
    $num_adv  = dbgetvar("SELECT COUNT(*) FROM advertisements");
    $num_comm = dbgetvar("SELECT COUNT(*) FROM comments");
    
    function dbgetvar($query){
      $res = mysql_query($query);
      if (!$res) {
        trigger_error("dbget: ".mysql_error()." in ".$query);
        return FALSE;
      }
      $row = mysql_fetch_row($res);
      if (!$row) return NULL;
      return $row[0];
    }
    

    总是从重复的代码中生成函数。

        2
  •  1
  •   Gazler    15 年前
    $query = "SELECT
    COUNT(n.*) as cnt_news,
    COUNT(a.*) as cnt_adv,
    COUNT(c.*) as cnt_comm,
    SUM(CASE WHEN c.approve = '1' AND c.spam = '0' THEN 1 ELSE 0 END) AS cnt_approved,
        SUM(CASE WHEN c.approve = '0' AND c.spam = '0' THEN 1 ELSE 0 END) AS cnt_unapproved,
        SUM(CASE WHEN c.spam = '1' THEN 1 ELSE 0 END) AS cnt_spam,
    SUM(a.amount) as t_amnt,
        SUM(a.cashpaid) as t_cpaid,
        SUM(a.balance) as t_bal
    FROM
    news n, advertisements a, comments c";
    

    这应该在一个查询中完成。

        3
  •  1
  •   shamittomar    15 年前

    mysqli 图书馆而不是 mysql 连接到MySQL的库。使用 mysqli::multi_query

    <?php
    $link = mysqli_connect("localhost", "user", "password", "dbname");
    
    /* check connection */
    if (mysqli_connect_errno())
    {
        printf("Connect failed: %s\n", mysqli_connect_error());
        exit();
    }
    
    //these are your queries. Put them all in a string separated by semicolon ;
    $query  = "SELECT COUNT(*) as cnt_news FROM news;";
    $query .= "SELECT COUNT(*) as cnt_adv FROM advertisements;";
    $query .= "SELECT COUNT(*) as cnt_comm FROM comments;";
    
    // Now execute multi query
    if (mysqli_multi_query($link, $query))
    {
        do {
            /* store first result set */
            if ($result = mysqli_store_result($link))
            {
                while ($row = mysqli_fetch_row($result))
                {
                    printf("%s\n", $row[0]);
                }
                mysqli_free_result($result);
            }
            /* print divider */
            if (mysqli_more_results($link)) {
                printf("-----------------\n");
            }
        } while (mysqli_next_result($link));
    }
    
    /* close connection */
    mysqli_close($link);
    ?>
    

    我只为你的三个问题举了一个例子。您可以在中放置更多查询 $query