0

外部xmlファイルからのすべての値を格納しているデータベーステーブルがあります。私のプロジェクト要件では、この正規化されていないデータを処理する必要があるためです。適切な方法でデータを抽出するのを手伝う必要があります。

2つのWebページ(1つはカテゴリ用)と1つは製品用です。データベーステーブルは次のようになります。

**product_id       Code        Name                   ProductRange         ProductSubRange         WebCategory**

   1               1002        Lid 30l                  Crystal;Uni         LIDs                    Household products

   2               10433       Casa Basket Silver       Casa                Casa Hipster BASKET      Kitchenware

   3               17443       Casa Basket Ice White    Casa;Laundry         LAUNDRY BASKET         Laundry products

   4               13443       Garden tub               Eden                Eden Garden Pots        Household products

   5               199990       Black Lid 201          Crystal             Crystal Lids            Household products

複数のproductRangeに属する製品は、セミコロン(;)で示されます。たとえば、「Lid301」という名前のproduct_id 1の上は、「Crystal」と「Uni」の2つの製品範囲に属しています。product_id 3についても同じです。ただし、製品2は単一のProductRangeに属しています。

私の質問:

1)「Webcategory」のquery_string値に基づいて「ProductRange」を返すことができるようにクエリを作成するにはどうすればよいですか?例:クエリ文字列からWebCategoryとして「HouseholdProducts」を取得した場合、次のように区別できます。

      Household Products
                       |-Crystal
                       |-Uni 
                       |-Eden

      Laundry Products
                       |-Casa
                       |-Laundry 

            Kitchenware
                       |-Casa

2)抽出されたProductRangesに基づいて、製品範囲とWebカテゴリに応じてWebページに製品を個別に表示したいと思います。たとえば、上から「Crystal」を選択すると、次のように、それぞれproduct_idが「1」と「5」の製品が表示されます。

  Household Products|
                    |-Crystal
                             |-Lid 301 (product_id=1)
                             |-Balck Lid 201 (product_id=5)

                    |-Uni
                             |-Lid 301 (product_id=1)

                    |-Eden
                             |-Garden Tub


         Kitchenware|
                    |-Casa
                          |-Casa Basket silver


    Laundry Products|
                    |-Casa
                            |-Casa Basket Ice White
                    |  
                    |-Laundry
                            |-Casa Basket Ice White

データベースからレコードを取得する方法と、プログラミングに慣れていないときに何をする必要があるかを誰かに教えてもらえますか?この点で誰かが私を助けてくれれば幸いです。

4

2 に答える 2

2

与えられたWebCategoryinput='XYZ'に基づいて個別の製品範囲を取得するには、次を使用できます。数値テーブルに恐れることはありません。これは、それぞれが1から増加する整数値を持つ行を含む便利なテーブルです。 。最大N。ここで、NはProductRange列の最大文字数です。これらは、手動で作成することも、次のような特別な挿入/選択クエリを使用して作成することもできます: http: //www.experts-exchange.com/Database/MySQL/A_3573-A-MySQL-Tidbit-Quick-Numbers-Table- Generation.html

SELECT DISTINCT  
SUBSTRING(ProductRange FROM number FOR LOCATE(';', ProductRange, number) - number) AS ProductRange  
FROM (  
    SELECT ProductRange, CASE number WHEN 1 THEN 1 ELSE number + 1 END number  
    FROM (  
        SELECT mydatabasetable.ProductRange, numberstable.number  
        FROM mydatabasetable  
        INNER JOIN numberstable  
        ON numberstable.number >= 1  
        AND numberstable.number <= CHAR_LENGTH(mydatabasetable.ProductRange)  
        WHERE WebCategory = 'XYZ'  
    ) TT  
    WHERE number = 1 OR (number + 1) <= CHAR_LENGTH(ProductRange)  
) TT  
WHERE SUBSTRING(ProductRange FROM number FOR 1) = ';'  
OR numberstable.number = 1;  

WebサイトのWebCategory、ProductRange、およびProductのすべての値を含む結果セットを取得するには、上記のクエリから派生した以下のわずかに変更されたバージョンを使用できます。結果が最初により意味のあるものになるように、ORDER BY句を追加して、すべての同じカテゴリ、同じ製品範囲の製品を次々に順番に保持します。これは、アプリケーション/サーバースクリプトコードで行うことを好む場合があるため、望ましい場合と望ましくない場合があります。その場合、害を及ぼすことなくORDERBY句を削除できます。

SELECT WebCategory,  
SUBSTRING(  
    ProductRange  
    FROM number  
    FOR LOCATE(';', ProductRange, number) - number  
) AS ProductRange,  
Product  
FROM (  
    SELECT WebCategory, ProductRange, Product,  
    CASE number  
    WHEN 1 THEN 1  
    ELSE number + 1  
    END number  
    FROM (  
        SELECT WebCategory, ProductRange, Product, numberstable.number  
        FROM mydatabasetable  
        INNER JOIN numberstable  
        ON numberstable.number >= 1  
        AND numberstable.number <= CHAR_LENGTH(ProductRange)  
    ) TT  
    WHERE number = 1 OR (number + 1) <= CHAR_LENGTH(ProductRange)  
) TT  
WHERE SUBSTRING(ProductRange FROM number FOR 1) = ';'  
OR numberstable.number = 1  
ORDER BY WebCategory, ProductRange, Product  
于 2012-11-25T15:23:06.397 に答える
0

クエリでGROUPBY句を実行し、詳細データが別のテーブルにある場合はJOINを実行することをお勧めします。私があなたを正しく理解していれば、それはこのように見えるでしょう。

SELECT T.WebCategory, T.ProductRange, T2.Product FROM table T 
INNER JOIN table2 T2 ON T2.ProductRange = T.ProductRange
WHERE T.WebCategory = 'Household products'
GROUP BY T.WebCategory, T.ProductRange, T2.Product

テストするデータベースを設定せずにクエリをテストするのは難しいですが、上記のようなものはあなたが探しているものを返すはずです。もちろん、2番目の表の実際の名前に基づいて列の名前を変更する必要があります。全体的に見て、私が質問を正しく理解していれば、これで始めることができます。

于 2012-11-25T13:45:02.580 に答える