0

そのため、動的な行から列への他の質問をいくつか読んでいます。ここで別の回答に別のクエリを適応させることにより、

mysql select dynamic row values as column names, another column as value

単一のテーブルで機能させることができますが、結果に含めるために他の2つのテーブルからレコードをプルする必要もあります。これらのテーブルを考えると:

Cars
ID    BRAND    NAME   etc1...
1     gmc      sierra
2     ford     ranger
3     dodge    dakota
4     kia      rio

Dice
ID    DESCRIPTION
1     blue
2     green
3     red
etc2. etc2.

Stock
ID    CAR_ID    DICE_ID    NUMBER
1     1         3          01V,3Y6
2     3         1          8Z4
3     2         2          03X
4     1         1          C7B

はい、これはあまり意味がありませんが、構造を示すだけです。私の結果は次のようになります。

CAR_ID    BRAND    NAME    etc1.    BLUE    GREEN    RED     etc2.
1         gmc      sierra  ...     C7B     null     01V,3Y6 ...
2         ford     ranger  ...     null    03X      null    ...
3         dodge    dakota  ...     8Z4     null     null    ...
4         kia      rio     ...     null    null     null    ...

静的であれば単純ですが、Cars and Dice の行数は動的になるため、ハードコーディングできません。Dice に行を列に出力させることはできますが、理解できないことが 2 つあります。

  • メインクエリは、Cars テーブルのすべての列と Dice テーブルのすべての行をリストすることになっていますが、Dice クエリを Cars クエリに添付する方法がわかりません。
  • Dice テーブルから相対的な説明を引き出して、列ヘッダーとして使用する必要があります。dice.id の使用は実用的でも役に立ちません。これを Dice テーブルの作業クエリに組み込む方法がわかりません。

望ましい結果を生み出す方法を知っている人はいますか?

編集 1: Dice の在庫があるかどうかに関係なく、結果にはすべての車がリストされている必要があることを忘れていました。

編集 2: NUMBER は製品番号を意味し、カウントしないことを明確にする必要がありました。これは、複数の製品番号を保持できる文字列フィールドです。レガシーデータです。

4

1 に答える 1

0

これを試して:

SET SESSION group_concat_max_len = 10000;
SELECT GROUP_CONCAT(DISTINCT CONCAT('MAX(IF(D.ID = ',D.ID,', D.ID, NULL)) as \'', D.DESCRIPTION, '\'')) INTO @sql FROM Dice D;

SET @s = CONCAT('SELECT C.*, ', @sql, ' FROM Cars C INNER JOIN Stock S ON C.Id = S.Car_Id  INNER JOIN Dice D ON S.DICE_ID = D.ID GROUP BY C.ID');

PREPARE stmt FROM @s;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
于 2013-09-07T05:40:29.813 に答える