我正在努力找到一个很好的解决方案来完成以下任务:
我有一张表,其中包括各种产品的名称,例如:
“潮汐 - 原始气味”。
另外,我也有相关数量,例如50液体盎司。
我现在面临的问题是,该产品不仅有50液盎司的容器,而且还有75 fl oz和100 fl oz等不同尺寸的容器。对于其中的每一个,我在产品表中都有新行:
id| productName | amount | unit
1 |"Tide - Original Scent" | 50 | "fl oz"
2 |"Tide - Original Scent" | 75 | "fl oz"
3 |"Tide - Original Scent" | 100 | "fl oz"
现在我有一个网页界面可以在这张桌子上进行搜索,每当我搜索“潮”时,我都会得到所有三行 - 当然应该是这样的。但是我想要一个不同的行为,这是我需要你帮助的地方:
而不是返回所有三行,我只想要一行。然后我需要能够在php中处理它,这样如果用户点击“Tide - Original Scent”,则会提示用户选择大小。
为任务添加更多复杂性:
我也在同一个表中有产品名为:
“潮 - 山泉”。
在这种情况下,设置一些关系会很棒,所以我知道“Tide - Original Scent”与“Tide - Mountain Spring”相关联。在php中,我不仅要让用户选择大小,还要选择(在这种情况下)香味。
您对我如何实现这一点(不是php部分)的建议是什么? 你的数据库怎么样? 我是否需要创建一个表格来映射这些产品?如果你要创建这个怎么样:)
答案 0 :(得分:1)
2种可能性:
不要将尺寸存储在该表中 - 以及其他特定信息。将其移动到另一个表。 Denormalize你的结构。
或
查询但group by名称。对于尺寸列,请执行count(amount)
。如果它不止一个,您可以选择填充下拉列表。这是一个很好的临时修复。
SELECT productName, count(amount) AS numOfChoices FROM YOUR_TABLE
WHERE LOWER(productName) LIKE 'tide%'
GROUP BY productName
然后做出选择
SELECT id, amount FROM YOUR_TABLE
WHERE id = "$selectedId"
提供可以确定哪个尺寸的尺寸选择。
答案 1 :(得分:0)
为子标签创建外键,并使用计数器对它们进行排序。这看起来像。
产品表:
品牌表:
可消耗表:
尺寸表:
ProductSize表:
然后,您将使用后续子标签划分为子类别。
产品
10 | 6 | 1.99
11 | 6 | 2.99
12 | 6 | 3.99
13 | 6 | 1.99
14 | 6 | 2.99
15 | 6 | 3.99
品牌
6 | Tide
子标签
30 | 10 | 1 | Original Scent
30 | 11 | 1 | Original Scent
30 | 12 | 1 | Original Scent
30 | 13 | 1 | Mountain Spring
30 | 14 | 1 | Mountain Spring
30 | 15 | 1 | Mountain Spring
尺寸表
1 | 50 | fl.oz.
2 | 75 | fl.oz.
3 | 100 | fl.oz.
产品尺寸表
1 | 10
1 | 13
2 | 11
2 | 14
3 | 12
3 | 15
答案 2 :(得分:0)
我个人会像这样设置我的表 ..
产品表:
ID| Product ID | Product Name | Description
1 | 0404888282 | Tide - Original Scent | Smells Good
数量表:
ID| Product ID | Size| Price | Quantity
1 | 0404888282 | 50 | 4.99 | 23
2 | 0404888282 | 75 | 5.99 | 120
3 | 0404888282 | 100 | 7.99 | 10
此结构为每个唯一项目提供一个表格,另一个表格用于每种尺寸的尺寸和数量。保持结构清洁,易于理解。
答案 3 :(得分:0)
“而不是返回所有三行,我只想要一行。”
SELECT DISTINCT productName FROM YOUR_TABLE WHERE LOWER(productName) LIKE 'tide%'
并且您需要LOWER(productName)
上的功能索引以获得良好的性能。或者,可以在支持该算法的DBMS上使用不区分大小写的归类序列(例如,MS SQL Server)。
“然后我需要能够在php中处理它,这样如果用户点击”Tide - Original Scent“,则会提示用户选择大小。”
SELECT amount FROM YOUR_TABLE WHERE productName = whatever_user_selected
“为任务添加更多复杂性:我在同一个表中也有产品名为: “潮 - 山泉”。“
上面的查询也会返回。
答案 4 :(得分:0)
你能做的是:
$Query = 'SELECT productName, amount, unit FROM products';
$Data = array();
while($Assoc = mysql_fetch_assoc($Query)){
if(!isset($Data[$Assoc['productName']])){
$Data[$Assoc['productName']] = array();
}
$Size = $Assoc['amount'].' '$Assoc['unit'];
$Data[$Assoc['productName']][] = $Size;
}
// Now what you can do is :
foreach($Data as $ProductName => $Amount){
echo $ProductName.' has :<br />';
if(count($Amount) > 0){
foreach($Amount as $Key => $Value){
echo $Value.'<br />';
}
} else {
echo 'Nothing<br />';
}
}
然而,这并没有解决MySQL方面的问题。 IT将在PHP中解决问题。它并不漂亮,但它正在发挥作用。
答案 5 :(得分:0)
对于第一个问题,您可以创建两个表:
id | description
---+------------
1 | crazy shirt
2 | clown shoe
product | name | value
--------+-------+-------
1 | color | green
1 | color | blue
1 | size | medium
2 | size | large
您可以通过创建attributes
表(甚至是attribute_names
表)来进一步优化attribute_values
表。
对于你的第二个问题,你可以:
products
表格中创建相关的产品ID列;这会限制每个产品只有一个相关产品。product_id | related_product_id
-----------+-------------------
1 | 2
1 | 3
这将在产品1和产品2和3之间建立关系。
希望这有帮助。