1

こんにちは、mysql で行を列として正常に選択しようとしています。

多分誰かが私を助けることができます。

これが私のテーブルの外観です

+----------+----------------------------------------------------+----------+
| brand_id | brand_name                                         | linecode | 
+----------+----------------------------------------------------+----------+
| DPQT     | 1-800 Tow Truck                                    | DER      | 
| DPQT     | 1-800 Tow Truck                                    | DCF      |
| DPQT     | 1-800 Tow Truck                                    | DCA      |
| DPQT     | 1-800 Tow Truck                                    | AAA      |
| DPQT     | 1-800 Tow Truck                                    | DDD      |
| BLGR     | 1-800-Radiator                                     | Curt     |
| BGVM     | 100+ Manufacturing/Coyote                          | ASC      |
| DPQS     | 10C Technologies Inc                               | AQW      |
| DPQS     | 10C Technologies Inc                               | ASQ      |
| FDJG     | 2 Cool AirVents                                    | CAS      |

そして、私は結果を次のようにしようとしています:

   +----------+----------------------------------------------------+-------+-------+-------+-------+-------+-------+-------+-------+-------+--------+
| 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   |

brand_id と brand_name が同じ場合にわかるように、回線コードを別々の列にグループ化したい

最大ライン コードは 10 です。そのため、Code1-Code10 があります。

これは私が現在行っていることであり、機能していません。

$sql0 = 'set @num := 0';
$result = mysqli_query($dbh,"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 := @num + 1 as group_row_number 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                                    | DER   | DCF   | DCA   | AAA   | DDD   | NULL  | NULL  | NULL  | NULL  | NULL   |
| BLGR     | 1-800-Radiator                                     | NULL  | NULL  | NULL  | NULL  | NULL  | Curt  | NULL  | NULL  | NULL  | NULL   |
| BGVM     | 100+ Manufacturing/Coyote                          | NULL  | NULL  | NULL  | NULL  | NULL  | NULL  | ASC   | NULL  | NULL  | NULL   |
| DPQS     | 10C Technologies Inc                               | NULL  | NULL  | NULL  | NULL  | NULL  | NULL  | NULL  | AQW   | ASQ   | NULL   |
| FDJG     | 2 Cool AirVents                                    | NULL  | NULL  | NULL  | NULL  | NULL  | NULL  | NULL  | NULL  | NULL  | CAS    |

brand_id と brand_name が変更されると、num 変数が 0 に戻るようにする方法が必要です。

ご覧のとおり、やりたいことを実行していますが、次の行に移動すると、num 変数は次の列に移動し続けます。そのため、次の行コードが追加される場所です。どこかにifステートメントが必要だと思いますが、その方法がわかりません。

これが起こるように誰かが私のクエリを更新できたら、私はとても感謝しています

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

4

3 に答える 3

1

あなたは部分的な転置について話しているのですが、これは PHP が自動的に行うものではありません。ただし、いくつかの小さな変更を加えることで、これを自分で行うことができます。

クエリでは、次を使用しますGROUP_CONCAT()

SELECT brand_id, brand_name, GROUP_CONCAT(linecode) AS codes brands GROUP BY brand_id, brand_name

PHP では、さまざまなコードexplode()を取得するために使用します。

$codes = explode(',', $row['codes']);

注:基礎となるテーブル構造について、いくつかの仮定を立てました。それに応じてクエリを調整します。

于 2012-12-03T18:57:28.867 に答える
0

編集:MySQLで完全に行う必要がある場合、これはきれいではありませんが...

SELECT 
    a.brand_id, a.brand_name, b.linecode AS code1, c.linecode AS code2, d.linecode AS code3, e.linecode AS code4, f.linecode AS code4 FROM test a 
LEFT JOIN 
    test b ON b.brand_id = a.brand_id 
LEFT JOIN 
    test c ON c.brand_id = b.brand_id AND b.linecode != c.linecode
LEFT JOIN 
    test d ON d.brand_id = c.brand_id AND d.linecode != c.linecode AND d.linecode != b.linecode
LEFT JOIN 
    test e ON e.brand_id = d.brand_id AND e.linecode != d.linecode AND e.linecode != c.linecode AND e.linecode != b.linecode
LEFT JOIN 
    test f ON f.brand_id = e.brand_id AND f.linecode != e.linecode AND f.linecode != d.linecode AND f.linecode != c.linecode AND f.linecode != b.linecode
GROUP BY 
    a.brand_id
ORDER BY 
    a.brand_id

コード列が 10 個になるまで LEFT JOIN を繰り返します。

于 2012-12-03T20:13:52.270 に答える
0
select a.name,a.value,a.code,T.code  from test1 as a INNER JOIN test1 as T on  
a.name=T.name and a.value = T.value and a.code != T.code  group by a.name;

これを試して。ブランド名とブランド ID は常に同じであると想定しています。異なる場合は、ブランド名のチェックを外します。

これは、クエリがどうあるべきかの単なるアイデアです。これを微調整して、より良い結果を得ることができます

于 2012-12-03T19:52:44.403 に答える