【问题标题】:MySql variables and phpMySql变量和php
【发布时间】:2009-10-16 22:12:58
【问题描述】:

我在 php.ini 中遇到了一个错误。格式化这个字符串以传递给 php 中的 mysql_query() 的正确方法是什么?

SELECT count(*) FROM agents INTO @AgentCount;

SELECT user_agent_parsed, user_agent_original, COUNT( user_agent_parsed ) AS thecount, 
    COUNT( * ) / ( @AgentCount) AS percentage
FROM agents
GROUP BY user_agent_parsed
ORDER BY thecount DESC LIMIT 50;

在 php 中,这是我设置 $query 的方式

      $query = "
      SELECT count(*) FROM agents INTO @AgentCount;

      SELECT user_agent_parsed, user_agent_original, COUNT( user_agent_parsed ) AS thecount, 
          COUNT( * ) / ( @AgentCount) AS percentage
      FROM agents
      GROUP BY user_agent_parsed
      ORDER BY thecount DESC LIMIT 50";

如果我通过命令行会话将其直接放入 MySql 中,该确切查询将正常工作。我是否需要对 mysql_query() 发出两个单独的 php 调用并存储第一个结果?

我收到以下错误:

您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以在第 3 行的 'SELECT user_agent_parsed, user_agent_original, COUNT(user_agent_parsed ) AS thecount' 附近使用正确的语法

不使用子选择而是选择 MySql 变量的原因是为了避免在每个百分比计算中发生 count()。尽管引擎可能正在为此进行优化。到目前为止,我还无法证实这一点。我还听说子选择几乎总是非最佳的。

解释告诉我这个:

id select_type table type possible_keys key key_len ref rows Extra 1 PRIMARY 代理索引 NULL user_agent_parsed 28 NULL 82900 使用临时;使用文件排序 2 SUBQUERY NULL NULL NULL NULL NULL NULL NULL 选择优化掉的表

【问题讨论】:

    标签: php mysql subquery


    【解决方案1】:

    在 PHP 中一次只能有一个查询。

     $query1 = "SELECT count(*) FROM agents INTO @AgentCount"
     $query2="  
      SELECT user_agent_parsed, user_agent_original, COUNT( user_agent_parsed ) AS thecount, 
      COUNT( * ) / ( @AgentCount) AS percentage
      FROM agents
      GROUP BY user_agent_parsed
      ORDER BY thecount DESC LIMIT 50";
    

    更新

    我有一个包含我所有查询的 DAL。我的 DAL 中的一个典型函数如下所示:

    // These functions are reusable 
      public function getAllRows($table)
      {
        $sql =" SELECT * FROM $table";
        $this->query($sql);
        return $this->query_result;       
      }
    

    然后在我的 BLL(业务层)中,我有以下内容:

      public function getUserAgents()
      {
          $result = parent::getAllRows();
          $row = mysql_fetch_array($result);
          return $row[0]; // Retrieves the first row
    
          // Then you take this value and to a second request. Then return the answer / rows.
      }
    

    【讨论】:

      【解决方案2】:

      如果您使用mysql_query,那么是的,您需要分别发送每个查询。来自mysql_queryentry in the PHP manual顶部的描述:“mysql_query() 向当前活动的数据库发送一个唯一查询(不支持多个查询)......”

      至于子查询,您会感到惊讶;查询优化器通常可以很好地处理它们。

      【讨论】:

        猜你喜欢
        • 2013-01-28
        • 2017-01-03
        • 2013-11-12
        • 2012-07-29
        • 1970-01-01
        • 2014-03-27
        • 1970-01-01
        • 1970-01-01
        • 2010-09-26
        相关资源
        最近更新 更多