2017-01-30 27 views
1

私はLAMP環境で作業しています。私は3テーブル &を持っているMySQLではMySQL:同じテーブルへの複数の結合と同じ行の別のテーブルへの結合

私は、以下の添付画像に述べたように目的のレポートを作成したいです。私はこれを達成するにはどうすればよい

enter image description here

。特別参加のFK_ProductTag_番号フィールドに非IDの整数を許可するためのテーブルProductMasterの

+0

今後、あなたの質問にあなたが試みた質問/仕事を含めてください。 – Ethilium

+0

私の現在のアプローチは次のとおりです。Join Table-1&Table-2。次に、クエリテーブル-3。次に、両方のクエリのPHPループ結合結果を使用して、目的のレポートを取得します。 @Ethiliumが提案した純粋なMySQLソリューションをMySQL + PHPアプローチと比較すると、純粋なMySQLソリューションがより効率的になると思います。あなたはどう思いますか? – MyO

+0

このソリューションでは、MySQLのみのオプションが理想的です。必要なもの以外の余分なデータをPHPに渡すことは望ましくありません。サイトのバックエンドにかかるオーバーヘッドが増えるだけでなく、クエリーに対して2つ目の障害ポイントが1つではなく作成されます。 – Ethilium

答えて

2

は、各FK_ProductTag_#が「0」の値を持つことができると仮定すると(各属性のために必要とされるここで要求されたクエリです:。

select a.ProductName as 'Product Name', 
a.Attr1 as 'Atrribute-1', 
b.Attr2 as 'Attribute-2', 
c.Attr3 as 'Atrribute-3' from 
    (select m.ProductName as 'ProductName', 
    concat_ws(': ', tagtype.Description, tag1.Description) as 'Attr1' 
    from ProductMaster m 
    left join ProductTag tag1 on m.FK_ProductTag_1 = tag1.ID 
    left join ProductTagType tagtype on tag1.FK_ProductTagType = tagtype.ID) as a 
join 
    (select m.ProductName as 'ProductName', 
    concat_ws(': ', tagtype.Description, tag2.Description) as 'Attr2' 
    from ProductMaster m 
    left join ProductTag tag2 on m.FK_ProductTag_2 = tag2.ID 
    left join ProductTagType tagtype on tag2.FK_ProductTagType = tagtype.ID) as b 
on a.ProductName = b.ProductName 
join 
    (select m.ProductName as 'ProductName', 
    concat_ws(': ', tagtype.Description, tag3.Description) as 'Attr3' 
    from ProductMaster m 
    left join ProductTag tag3 on m.FK_ProductTag_3 = tag3.ID 
    left join ProductTagType tagtype on tag3.FK_ProductTagType = tagtype.ID) as c 
on a.ProductName = c.ProductName 
order by a.ProductName asc 

デモのために、このSQLFiddleを参照してくださいSQLFiddleがテスト中調子なので、デモ用SQLTestに上記のクエリと、以下の表のスキーマをコピーした

:。

create table ProductTagType (ID int not null auto_increment, Description varchar(20), primary key (ID)); 
create table ProductTag (ID int not null auto_increment, Description varchar(20), FK_ProductTagType int(1), primary key (ID)); 
create table ProductMaster (ID int not null auto_increment, ProductName varchar(20), FK_ProductTag_1 int(1), FK_ProductTag_2 int(1), FK_ProductTag_3 int(1), primary key (ID)); 
insert into ProductTagType (Description) 
values ('Imported'), ('Local'), ('HomeMade'); 
insert into ProductTag (Description, FK_ProductTagType) 
values ('Wood', 2), ('Plastic', 2), ('Steel', 1), ('Aluminum', 3); 
insert into ProductMaster (ProductName, FK_ProductTag_1, FK_ProductTag_2, FK_ProductTag_3) 
values ('Chair', 1, 2, 3), ('Table', 0, 3, 4); 
関連する問題