0

クエリ結果を変換する必要があるため、同じ外部キーを持つ複数の行は 1 つの行にすぎません。グループ化でそれを行うことができます。問題は、私の列の 1 つで、いくつかの列を異なるグループに連結したいということです。たとえば、私のテーブルには次のようなものが含まれています。

shopId     Brand    Category    Color     QTY
----------------------------------------------
15         Dell     NoteBook    Red       5
15         Dell     NoteBook    Blue      1
15         HP       NoteBook    red       2
15         HP       NetBook     red       3
14         Sony     NoteBook    yellow    1
14         Acer     Tablet      red       10

Brand、Category、および Color はすべて、外部キーから取得されます。この結果を次のように提示したい

ShopId      Dell    Color             HP    Color    etc...
-----------------------------------------------------------
15          6       red:5, Blue:1     2     red:2    
14 ..............

私のクエリでは、それらを shopId でグループ化し、sum ステートメントと case ステートメントを使用して各ブランドとカテゴリの合計数量を見つけるのは簡単な作業でした。私の問題は、ショップ、カテゴリ、ブランドのグループ化の色と数量を連結するにはどうすればよいですか (合計のグループ化は、ショップ、カテゴリ、ブランドではなく、shopId ごとです)。

私のタバレは

CREATE TABLE `shopstorage` (
 `color` int(11) NOT NULL,
 `category` int(11) NOT NULL,
 `brand` int(11) NOT NULL,
 `shop` int(11) NOT NULL,
 `date` 日付 NOT NULL,
 `qty` tinyint(4) NOT NULL,
 PRIMARY KEY (`color`,`category`,`brand`,`shop`,`date`),
 KEY `clrEpClr` (`color`),
 KEY `clrEpCat` (`category`),
 KEY `clrEpshop` (`ショップ`),
 KEY `clrEpBrand` (`ブランド`),
 CONSTRAINT `SSBrand` FOREIGN KEY (`brand`) REFERENCES `brand` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION,
 CONSTRAINT `SSCat` FOREIGN KEY (`category`) REFERENCES `productcategory` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION,
 CONSTRAINT `SSClr` FOREIGN KEY (`color`) REFERENCES `color` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION,
 CONSTRAINT `SSShop` FOREIGN KEY (`shop`) REFERENCES `shop` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION
) エンジン=InnoDB デフォルト文字セット=utf8

私の不完全なクエリは

選択する
    店.名前、店.階、店.番号、
    sum(brand.name ='ASUS' and productcategory.name='NoteBook' then shopstorage.qty else 0 end) の場合、ASUS として、
    sum(brand.name ='HP' and productcategory.name='NoteBook' then shopstorage.qty else 0 endの場合)をHPとして、
    sum(case when brand.name ='Sony' and productcategory.name='NoteBook' then shopstorage.qty else 0 end) as Sony,
    sum(brand.name ='Dell' and productcategory.name='NoteBook' then shopstorage.qty else 0 end) の場合、Dell として、
    sum(brand.name ='ASUS' and productcategory.name='NetBook' then shopstorage.qty else 0 end) の場合、ASUS として、
    sum (brand.name ='HP' and productcategory.name='NetBook' then shopstorage.qty else 0 end) の場合、HP として、
    sum(brand.name ='Sony' and productcategory.name='NetBook' then shopstorage.qty else 0 end) の場合、Sony、
    sum(brand.name ='Dell' and productcategory.name='NetBook' then shopstorage.qty else 0 end) の場合、Dell として、
    sum(brand.name ='ASUS' and productcategory.name='Tablet' then shopstorage.qty else 0 end) の場合、ASUS として、
    sum(brand.name ='HP' and productcategory.name='Tablet' then shopstorage.qty else 0 endの場合)をHPとして、
    sum(brand.name ='Sony' and productcategory.name='Tablet' then shopstorage.qty else 0 end) の場合、Sony、
    sum(brand.name ='Dell' および productcategory.name='Tablet' の場合、shopstorage.qty、それ以外の場合は 0 end) as Dell
ショップストレージから
    shopstorage.brand=brand.id でブランドに参加
    shopstorage.color=color.id で色に参加
    shopstorage.category=productcategory.id で productcategory に参加
    shop.id = shopstorage.shop でショップに参加
shopstorage.shop ごとにグループ化

たとえば、HP が 15 の場合、各色の数量を指定するために各合計の後に列を追加する方法を探しています。7 つの赤と 8 つの青のノートブックがあります。GROUP_Concat を試しましたが、間違ったグループ化のために正しい結果が表示されませんでした。

4

1 に答える 1

0

答えを見つけて、他の人と共有したいと思います。各合計の後にクエリに以下のコードを追加しました

,group_concat(case when brand.name='{$brand['name']}' and category={$category['id']} then concat(color.name,':',num) end) as {$brand['name']}C

{$brand['name']} と {$category['id']} は、ブランドとカテゴリの間を繰り返すための私の php コードの変数です。このような簡単な解決策を見つけるのになぜそんなに時間がかかったのかわかりません。 P 私に恥をかかせます :D

于 2012-08-14T07:42:17.290 に答える