1

我正在尝试找到一个好的解决方案来完成以下任务:

我有一张表,其中包含各种产品的名称,例如:
“潮汐 - 原始气味”。
此外,我还有 50 液量盎司的量。

我现在遇到的问题是,该产品不仅装在 50 液量盎司的容器中,而且还有不同的尺寸,例如 75 液量盎司和 100 液量盎司。对于其中的每一个,我在产品表中都有新行:

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 中处理它,以便如果用户单击“潮汐 - 原始气味”,然后提示用户选择尺寸。

让任务更加复杂:我在同一张表中也有产品,名称为:
“潮汐 - 山泉”。
在这种情况下,最好建立一些关系,所以我知道“潮 - 原香”与“潮 - 山泉”相关联。然后,在 php 中,我不仅要让用户选择选择大小,还要让用户选择(在这种情况下)气味。

您对我如何实现这一点(不是 php 部分)有什么建议?
你的数据库会是什么样子?
我是否需要创建一个表格来映射这些产品?如果你要创建这个会是什么样子:)

4

6 回答 6

1

2种可能性:

不要将尺寸与其他特定信息一起存储在该表中。将其移至另一张桌子。非规范化你的结构。

或者

查询但名称分组。对于大小列,执行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"

提供一种尺寸选择,以指出哪一种尺寸。

于 2012-05-30T17:33:15.103 回答
0

为子标签创建外键,并使用计数器对其进行排序。这看起来像。

产品表:

  • 产品 ID(密钥)
  • 品牌标识
  • 价格

品牌表:

  • 品牌 ID(键)
  • 品牌

可转表:

  • ID
  • 产品编号
  • 订单索引
  • 价值

尺码表:

  • 尺码 ID
  • 价值
  • 单元

产品尺寸表:

  • 尺码 ID
  • 产品编号

然后,您将使用后续子标签划分子类别。

产品

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
于 2012-05-30T17:33:07.713 回答
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

在这种结构中,您有一个表格用于每个独特的项目,另一个用于每个尺寸的尺寸和数量。保持结构干净且易于理解。

于 2012-05-30T17:37:04.500 回答
0

“而不是返回所有三行,我只想要一行。”

SELECT DISTINCT productName FROM YOUR_TABLE WHERE LOWER(productName) LIKE 'tide%'

而且您需要一个功能索引LOWER(productName)才能获得良好的性能。或者,可以在支持它的 DBMS(例如 MS SQL Server)上使用不区分大小写的排序规则序列。

“然后我需要能够在 php 中处理它,这样如果用户点击“潮汐 - 原始气味”,就会提示用户选择尺寸。”

SELECT amount FROM YOUR_TABLE WHERE productName = whatever_user_selected

“为了增加任务的复杂性:我在同一张表中也有产品,名为:“潮汐 - 山泉”。”

上面的查询也将返回。

于 2012-05-30T17:39:41.397 回答
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 中运行而不会出现问题。它并不漂亮,但它正在工作。

于 2012-05-30T17:39:54.537 回答
0

对于第一个问题,您可以创建两个表:

  1. 产品 - 这是您存储有关产品的所有信息的地方,但不同尺寸、颜色等细节除外。
  2. 属性 - 您将链接到产品并为每个属性指定一个值

产品

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表)来进一步优化表。

对于第二个问题,您可以:

  1. 在表内创建一个相关的产品 id 列products;这将限制您每个产品只能使用一种相关产品。
  2. 创建一个相关的产品表,您可以在其中存储两个产品之间的组合。

相关产品

product_id | related_product_id
-----------+-------------------
         1 | 2
         1 | 3

这将在产品 1 与产品 2 和 3 之间建立关系。

希望这可以帮助。

于 2012-05-30T17:43:12.023 回答