我有一个数据库表,其中存储外部 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的产品用分号(;)表示。例如,上面的产品 ID 1 名称为“Lid 301”,属于两个产品范围“Crystal”和“Uni”。 Product_id 3 也是如此。但是,产品 2 属于单个 ProductRange。
我的问题:
1) 如何构建查询,以便它可以根据“Webcategory”的 query_string 值返回“ProductRange”?例如: 如果我从查询字符串中获取“Household Products”作为我的 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
任何人都可以指导我如何从数据库中检索记录以及作为编程新手我需要做什么?如果有人能在这方面帮助我,我将不胜感激。
最佳答案
为了根据给定的 WebCategory 输入 = '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;
为了检索包含您网站的所有值 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
关于php - 使用 PHP 爆炸来自 mysql 的数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13551131/