与这个问题的版本摔跤了几个小时,我知道这可能是我失踪的一点点。
我根据这篇文章中的第一个答案进行了查询:
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, '');
答案 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