MySQL查询与会话(@variables)在MySQL Workbench中工作,但不在PHP中

时间:2012-05-09 20:11:33

标签: php mysql

与这个问题的版本摔跤了几个小时,我知道这可能是我失踪的一点点。

我根据这篇文章中的第一个答案进行了查询:

How do I limit the number of rows per field value in SQL?

我在MySQL Workbench中完全按照我的意愿行事,但在运行时不会将会话变量设置为“2”:

mysql_query()
PHP中的

以下是一个表格'mytab',用于演示问题:

+----+--------------+---------------+
| id | first_column | second_column |
+----+--------------+---------------+
|  1 |            1 |             1 |
|  2 |            1 |             4 |
|  3 |            2 |            10 |
|  4 |            3 |             4 |
|  5 |            1 |             4 |
|  6 |            2 |             5 |
|  7 |            1 |             6 |
+----+--------------+---------------+

简化查询:

select
    id, first_column, second_column, row_num
from 
(
    select *,
    @num := if(@first_column = first_column, 2, 1) as row_num,
    @first_column := first_column as c
    from mytab order by first_column,id
) as t
having row_num <= 1; 

从MySQL工作台我得到了这个:

+----+--------------+---------------+---------+
| id | first_column | second_column | row_num |
+----+--------------+---------------+---------+ 
|  1 |            1 |             1 |       1 |
|  3 |            2 |            10 |       1 |
|  4 |            3 |             4 |       1 |
+----+--------------+---------------+---------+

从PHP我得到了这个:

+----+--------------+---------------+---------+
| id | first_column | second_column | row_num |
+----+--------------+---------------+---------+
|  1 |            1 |             1 |       1 |
|  2 |            1 |             4 |       1 |
|  3 |            2 |            10 |       1 |
|  4 |            3 |             4 |       1 |
|  5 |            1 |             4 |       1 |
|  6 |            2 |             5 |       1 |
|  7 |            1 |             6 |       1 |
+----+--------------+---------------+---------+

我做错了吗?

非常感谢!


编辑:这是我精简的PHP代码,因为现实中的问题与一些更复杂的东西有关。

class sql_helper extends other
{
    public function query_handler($sql, $error_message) 
    {
        $this->connect(); // Not shown, but works without issue

        $result = mysql_query($sql) or die($error_message.''.mysql_error());

        return $result;
    }

    public static function sql_result_to_assoc($sql_result) 
    {
        $result_array = array();

        while($row = mysql_fetch_assoc($sql_result))
            $result_array[] = $row;

        return $result_array;
    }

    public function sql_to_assoc($sql, $error_message)
    {
        $result = $this->query_handler($sql, $error_message);

        return $this->sql_result_to_assoc($result);
    }
}

$sql = "
    select
    id, first_column, second_column, row_num
    from 
    (
        select *,
        @num := if(@first_column = first_column, 2, 1) as row_num,
        @first_column := first_column as c
        from mytab order by first_column,id
    ) as t
    having row_num<=1";

$sql_helper   = new sql_helper();
$result_array = $sql_helper->sql_to_assoc($sql, '');

2 个答案:

答案 0 :(得分:2)

您需要初始化会话变量:

SET @num:=0;
SET @first_column:=0;

这必须在同一个MySQL会话中和查询之前完成。

答案 1 :(得分:0)

当Jerahian回答时,他们需要参加同一场会议。我通常做内联声明,但你必须包装好像它是一个选择并分配一个“别名”,如

select
    id, first_column, second_column, row_num
from 
   ( select *,
           @num := if(@first_column = first_column, 2, 1) as row_num,
           @first_column := first_column as c
        from 
           mytab,
           ( select @first_column := 0 ) as Sqlvars
      order by 
           first_column,
           id
   ) as t
having 
   row_num <= 1; 

注意@first_column:= 0的非常微妙的初始化为“sqlvars”别名......然后它可以按照您的意图使用。如果您有多个变量,只需将逗号分开,就像其他列一样......例如

   ( select @first_column := 0, 
            @someOtherField := '2013-06-02',
            @someString := 'testing' ) as Sqlvars