0

2 つの MySQL テーブルがあります。

  • 属性 (属性 ID、名前)
  • 製品属性 (製品 ID、属性 ID、表示値)

「製品タイプ」と呼ばれる属性名ごとに、この「製品タイプ」に関連付けられている他のすべての属性を取得する必要があります。例として、属性テーブルは次のようになります。

    attributeid  name
    1            A
    2            B
    3            Product Type
    4            D

productsattributes テーブルは次のようになります。

productid attributeid displayvalue
        1         3           FAN
        1         1           Brown
        1         2           Stand
        2         3           FAN
        2         4           D
        3         3           CAR
        3         4           imported

したがって、最終結果は次のようになります。

FAN (A,B, Product Type,D) 
CAR (Product Type, imported)

これが私の試みです:

  • まず、productattributes からすべての「表示値」を取得します。
SELECT DISTINCT displayvalue 
  FROM productsttributes 
 WHERE attributeid = 3;
  • 次に、各「displayvalues」をループして、他の属性を見つけます。
SELECT a.name 
 FROM attributes a 
 INNER JOIN productsattributes pa 
    ON pa.attributeid = a.attributeid AND productid in (
        SELECT productid 
        FROM productsttributes 
        WHERE dispalyvale =  '$displayvalue') 
 ORDER BY a.name;

問題は、productattributes テーブルに約 700 万行あるため、スクリプトに時間がかかることです。もちろん、10 分の解決策を探しているわけではありませんが、少なくともクエリが少し改善されます。

4

2 に答える 2

1

私は次のステートメントから始めます。

ALTER TABLE attributes ADD CONSTRAINT p_attributes PRIMARY KEY (attributeid);
ALTER TABLE productsattributes ADD CONSTRAINT p_productsattributes
    PRIMARY KEY(productid, attributeid);
ANALYZE TABLE attributes, productsattributes;

これにより、すべての重要なフィールドが確実にインデックス化されます。

クエリは次のようになります ( SQL Fiddleでも):

SELECT trg.displayvalue,
       group_concat(a.name ORDER BY trg.productid, a.attributeid)
  FROM (
        SELECT t.productid,t.displayvalue
          FROM attributes a
          JOIN productsattributes t USING (attributeid)
         WHERE a.name = 'Product Type') AS trg
  JOIN productsattributes p ON p.productid = trg.productid
  JOIN attributes a ON a.attributeid = p.attributeid
 GROUP BY trg.displayvalue
 ORDER BY 1;

EXPLAINあなたの出力とこのクエリを質問に含めてください。

于 2012-07-01T05:46:45.597 に答える
0

これを試して ::

Select displayvalue, attribute_name
from 
(Select 
product_id from productsattributes pa inner join attributes_table at on (pa.attributeid=at.id) where at.name=?) as productList
inner join  productsattributes pa2 on(pa2.product_id=productList.product_id)
inner join attributes_table at2 on (pa2.attributeid=at2.id)
于 2012-07-01T05:11:56.737 に答える