0

我有一个数据库表,我在其中存储来自外部 xml 文件的所有值。由于我的项目要求要求我处理这些非标准化数据。我需要帮助以适当的方式提取数据。

我有两个网页(一个用于类别)和一个用于产品。我的数据库表如下所示:

**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 的产品用我的分号 (;) 表示。例如,名称为“Lid 301”的 product_id 1 上方属于“Crystal”和“Uni”两个产品范围。product_id 3 也是如此。但是产品 2 属于单个 ProductRange。

我的问题:

1)如何构造一个查询,以便它可以根据我的“Webcategory”的 query_string 值返回“ProductRange”?例如:如果我从查询字符串中获得“家居产品”作为我的 WebCategory,它可能会给我这样的不同:

      Household Products
                       |-Crystal
                       |-Uni 
                       |-Eden

      Laundry Products
                       |-Casa
                       |-Laundry 

            Kitchenware
                       |-Casa

2)基于提取的ProductRanges,我想根据产品范围和网络类别在我的网页中单独显示产品。例如,如果我从上面选择“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

为了根据给定的 WebCategory 输入 = 'XYZ' 获得不同的产品范围,您可以使用以下命令 - 不要被 numberstable 吓倒,它只是一个有用的表,其中包含每行从 1 开始的整数值递增的行。 . 最多 N,其中 N 是 ProductRange 列中的最大字符数。这些可以手工制作,也可以使用特殊的插入/选择查询,如此处找到的查询: http ://www.experts-exchange.com/Database/MySQL/A_3573-A-MySQL-Tidbit-Quick-Numbers-Table-生成.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;  

为了为您的网站检索包含所有值 WebCategory、ProductRange 和 Product 的结果集,您可以使用从上述查询派生的以下稍作修改的版本。为了让结果一开始看起来更有意义,我添加了一个 ORDER BY 子句,以使所有相同类别、相同产品范围的产品一个接一个地保持顺序。这可能需要也可能不需要,因为您可能更喜欢在应用程序/服务器脚本代码中这样做。在这种情况下,您可以删除 ORDER BY 子句而不会造成任何伤害。

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

您可能想要在查询中执行 GROUP BY 子句,如果详细数据位于不同的表中,则可能执行 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

如果没有要测试的数据库设置,很难测试我的查询,但类似上面的内容应该返回您正在寻找的内容。您当然需要根据第二个表中的实际名称重命名列。总的来说,如果我正确理解了这个问题,这应该会让你开始。

于 2012-11-25T13:45:02.580 回答