0

こんにちは、何がうまくいかないのか理解するのに苦労しています..

このステートメントを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の両方でまったく同じクエリを使用しています.mysql_queryを呼び出すときにphpに構文の違いがあると仮定しています.

誰かが助けてくれたら、とても感謝しています

お時間をいただきありがとうございます。

4

2 に答える 2

0

選択した列に列を含めて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 が期待どおりに増加します。

于 2012-11-30T14:53:55.007 に答える
0

あなたが持っているあなたの最も内側のプレクエリ

          @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 の結果にカウンターを追加する必要があるかもしれません。

于 2012-11-30T15:03:35.043 に答える