【问题标题】:different results on a mysql query in php than in just mysqlphp 中 mysql 查询的结果与 mysql 不同
【发布时间】:2012-11-30 14:19:12
【问题描述】:

您好,我很难意识到出了什么问题..

当我在 mysql 中运行这条语句时..

select brand_id,   brand_name,   
max(case when group_row_number = 1 then linecode end) Code1,   
max(case when group_row_number = 2 then linecode end) Code2,   
max(case when group_row_number = 3 then linecode end) Code3,   
max(case when group_row_number = 4 then linecode end) Code4,   
max(case when group_row_number = 5 then linecode end) Code5,   
max(case when group_row_number = 6 then linecode end) Code6,   
max(case when group_row_number = 7 then linecode end) Code7,   
max(case when group_row_number = 8 then linecode end) Code8,   
max(case when group_row_number = 9 then linecode end) Code9,   
max(case when group_row_number = 10 then linecode end) Code10 
from (   select brand_id,     brand_name,     linecode,     
@num := if(@brand_id = `brand_id` AND @brand_name = `brand_name`, @num + 1, 1) as 
group_row_number,     @brand_id := `brand_id` as dummy,   
@brand_name := `brand_name` as linedummy   from linecodes_temp ) 
src group by brand_id, brand_name order by if(linecode = '' or linecode is null,1,0), 
brand_name ASC;

我收到了我想要的结果。

  +----------+----------------------------------------------------+-------+-------+-------+-------+-------+-------+-------+-------+-------+--------+
| brand_id | brand_name                                         | Code1 | Code2 | Code3 | Code4 | Code5 | Code6 | Code7 | Code8 | Code9 | Code10 |
+----------+----------------------------------------------------+-------+-------+-------+-------+-------+-------+-------+-------+-------+--------+
| DPQT     | 1-800 Tow Truck                                    | DCF   | DCA   | AAA   | DDD   | DER   | NULL  | NULL  | NULL  | NULL  | NULL   |
| BLGR     | 1-800-Radiator                                     | Curt  | NULL  | NULL  | NULL  | NULL  | NULL  | NULL  | NULL  | NULL  | NULL   |
| BGVM     | 100+ Manufacturing/Coyote                          | ASC   | NULL  | NULL  | NULL  | NULL  | NULL  | NULL  | NULL  | NULL  | NULL   |
| DPQS     | 10C Technologies Inc                               | ASQ   | AQW   | NULL  | NULL  | NULL  | NULL  | NULL  | NULL  | NULL  | NULL   |
| FDJG     | 2 Cool AirVents                                    | CAS   | NULL  | NULL  | NULL  | NULL  | NULL  | NULL  | NULL  | NULL  | NULL   |
| DWFD     | 31 Incorporated                                    | ASD   | NULL  | NULL  | NULL  | NULL  | NULL  | NULL  | NULL  | NULL  | NULL   |
| BBBB     | 3M                                                 | snoop | NULL  | NULL  | NULL  | NULL  | NULL  | NULL  | NULL  | NULL  | NULL   |

这是完美的。

但是当我转身并在 php 中调用它时。

$result = mysql_query("select brand_id,   brand_name,   max(case when group_row_number = 1 then linecode end) Code1,   max(case when group_row_number = 2 then linecode end) Code2,   max(case when group_row_number = 3 then linecode end) Code3,   max(case when group_row_number = 4 then linecode end) Code4,   max(case when group_row_number = 5 then linecode end) Code5,   max(case when group_row_number = 6 then linecode end) Code6,   max(case when group_row_number = 7 then linecode end) Code7,   max(case when group_row_number = 8 then linecode end) Code8,   max(case when group_row_number = 9 then linecode end) Code9,   max(case when group_row_number = 10 then linecode end) Code10 from (   select brand_id,     brand_name,     linecode,      @num := if(@brand_id = `brand_id` AND @brand_name = `brand_name`, @num + 1, 1) as group_row_number,     @brand_id := `brand_id` as dummy,     @brand_name := `brand_name` as linedummy   from linecodes_temp ) src group by brand_id, brand_name order by if(linecode = '' or linecode is null,1,0), brand_name ASC",$dbh);

然后做一个

while($row = mysql_fetch_assoc($result)) {

遍历表格

我得到的结果是

 brand_id       brand_name                  Code1   Code2 Code3 Code4 Code5 to Code 10
 DPQT           1-800 Tow Truck             DER         
 BLGR           1-800-Radiator              Curt            
 BGVM           100+ Manufacturing/Coyote   ASC         
 DPQS           10C Technologies Inc        ASQ         
 FDJG           2 Cool AirVents             CAS         
 DWFD           31 Incorporated             ASD         
 BBBB           3M                          snoop           

当我执行 var_dump($row) 时,上面 php 查询的结果会显示出来,所以我知道我在这方面没有做错任何事情

我在 mysql 和 php 中都使用了完全相同的查询

如果有人能帮忙,我将非常感谢

感谢您的宝贵时间。

【问题讨论】:

  • 显示您的显示代码,例如var_dump($row) 在您的 fetch 循环中。简单地从 PHP 运行它不太可能改变结果。
  • 我只是做了同样的结果。正如我从 php 发布的表格一样。
  • 所以除了第一个“Code1”之外,您没有得到任何其他代码?那是对的吗?仅供参考,出于安全原因,不鼓励使用 mysql 命令,而建议使用更安全的 mysqli 命令。
  • 我同意@MarcB。检查您的循环逻辑以确保一切都按您的预期进行。
  • 我将其转换为 mysqli 并且结果相同

标签: php mysql sql database select


【解决方案1】:

您拥有的最内在的预查询

          @brand_name := `brand_name` as linedummy   
       from 
          linecodes_temp ) src 

您需要在此处添加您的 ORDER BY 子句

          @brand_name := `brand_name` as linedummy   
       from 
          linecodes_temp
       order by
          `brand_id`, `brand_name` ) src 

如果您不这样做,内部查询会以原始顺序读取数据,这可能会使它们从 ID 1、2、2、1、3、1、2、1、2 等交错排列。每次切换回来时,它会将您的计数器重置回 1,从而覆盖您之前的代码 1 设置。

您甚至可能需要在内部 order by 之后将计数器添加到 OUTER 结果中。

【讨论】:

  • 我尝试了你让我做的事情。结果还是和以前一样。
  • 我只是不明白为什么在 mysql 中我得到正确的结果,但在 php 中却没有
【解决方案2】:

在您选择的列中包含group_row_number 列并回显它们,看看这是否真的按预期工作。

另一个区别可能在于linecodes_temp,这取决于在普通 MySQL 或 PHP 版本中是如何设置的。

我将您的子选择重写为

$sql0 = 'set @num := 0';
$result = mysql_query($sql0, $dbh);
// error handling
$sql = 'select brand_id, brand_name, @num := @num + 1 as group_row_number from linecodes_temp';
$result = mysql_query($sql, $dbh);
// error handling
while ($row = mysql_fetch_assoc($result)) {
    // process result set
}

现在 group_row_number 按预期增加。

【讨论】:

  • 我经历了,linecodes_temp 正是它应该的样子
  • @user1863457 那么 group_row_number 呢?它们也按升序排列吗?
  • 上面是我在 mysql 中使用的查询,它返回了正确的结果。我似乎无法理解它为什么会改变......为什么在 php 中调用 mysql_query
  • @user1863457 我刚刚在 MySQL 和 PHP 中尝试了您的子选择(带有 group_row_number 的部分)。在两种情况下,group_row_number 总是 1。请查看我的回答中建议的子选择重写。
  • 现在我需要弄清楚如何做出正确的 if 语句才能使其正常工作。当brand_id 和brand_name 改变num 回到0
猜你喜欢
  • 2015-02-09
  • 1970-01-01
  • 2010-11-12
  • 2019-03-21
  • 2016-02-22
  • 1970-01-01
  • 2018-04-23
  • 2015-07-12
  • 2011-06-01
相关资源
最近更新 更多