【问题标题】:php sql multiple queries into onephp sql 多个查询合二为一
【发布时间】:2012-01-06 00:10:14
【问题描述】:

在我的页面的一部分,我有很多小的查询,大概总共有 6 个,从不同的表中获取数据。举个例子:

$sql_result = mysql_query("SELECT * FROM votes WHERE voted_on='$p_id' AND vote=1", $db); 
$votes_up = mysql_num_rows($sql_result);

$sql_result = mysql_query("SELECT * FROM votes WHERE voted_on='$p_id' AND vote=0", $db);
$votes_down = mysql_num_rows($sql_result);

$sql_result = mysql_query("SELECT * FROM kids WHERE (mother_id='$p_id' OR father_id='$p_id')", $db); 
$kids = mysql_num_rows($sql_result);

如果这些都在一个查询中获取以节省对数据库的访问会更好吗?一个查询优于 6 不是吗?

会是某种 JOIN 还是 UNION?

【问题讨论】:

    标签: php join union


    【解决方案1】:

    这与查询的数量无关,而是与您传输的有用数据的数量有关。如果你在 localhost 上运行数据库,最好让 sql 引擎解决查询,而不是在额外的程序中计算结果。如果您正在考虑谁应该更忙,也是如此。 Apache 或 mysql :)

    当然你可以使用一些条件:

    SELECT catName,
     SUM(IF(titles.langID=1, 1, 0)) AS english,
     SUM(IF(titles.langID=2, 1, 0)) AS deutsch,
     SUM(IF(titles.langID=3, 1, 0)) AS svensk,
     SUM(IF(titles.langID=4, 1, 0)) AS norsk,
    COUNT(*)
    FROM titles, categories, languages
    WHERE titles.catID = categories.catID
    AND titles.langID = languages.
    

    MYSQL 圣经中使用的例子:)

    【讨论】:

      【解决方案2】:

      如果你真的想减少查询的数量,你可以像这样把前两个放在一起:

      $sql_result = mysql_query("SELECT * FROM votes WHERE voted_on='$p_id'", $db); 
      while ($row = mysql_fetch_array($sql_result)) 
      {
      extract($row);
      if ($vote=='0') ++$votes_up; else ++$votes_down;    
      }
      

      【讨论】:

        【解决方案3】:

        连接表的想法是这些表之间应该有一些东西(例如关系)。

        对于 UNION SELECTS 也是如此,最好避免使用。

        如果你希望你的解决方案在未来变得干净和可扩展,我建议你使用 mysqli,而不是 PHP 的 mysql 模块。

        参考:mysqli::multi_query。有 OOP 变体,您可以在其中创建 mysqli 对象并将函数作为方法调用。

        然后,您的查询应如下所示:

        // I use ; as the default separator of queries, but it might be different in your case.
        // The above could be set with sql statement: DELIMITER ;
        
        
        
        $query = "
            SELECT * FROM votes WHERE voted_on='$p_id' AND vote=1;
            SELECT * FROM votes WHERE voted_on='$p_id' AND vote=0;
            SELECT * FROM kids WHERE (mother_id='$p_id' OR father_id='$p_id');
        ";
        
        $results = mysqli_multi_query($db, $query); // Returns an array of results
        

        【讨论】:

          【解决方案4】:

          更少的查询(通常,并非总是)更好,但这也是为了让您的代码足够清晰,以便其他人能够理解查询。例如,在您提供的代码中,将前两个放在一起,将最后一个分开。

          $sql_result = mysql_query("SELECT vote, COUNT(*) AS vote_count 
              FROM votes
              WHERE voted_on='$p_id'
              GROUP BY vote", $db);
          

          以上将返回给您两行,每行包含投票值(0 或 1)和该值的投票计数。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2016-11-18
            • 1970-01-01
            • 1970-01-01
            • 2014-06-23
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多