映射具有相似名称的产品

时间:2012-05-30 17:26:59

标签: php sql

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

我有一张表,其中包括各种产品的名称,例如:
“潮汐 - 原始气味”。
另外,我也有相关数量,例如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部分)的建议是什么? 你的数据库怎么样? 我是否需要创建一个表格来映射这些产品?如果你要创建这个怎么样:)

6 个答案:

答案 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)

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

产品表:

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

品牌表:

  • 品牌ID(关键)
  • 品牌

可消耗表:

  • ID
  • 产品ID
  • 订单索引

尺寸表:

  • 尺码ID
  • 单元

ProductSize表:

  • 尺码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

答案 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)

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

  1. 产品 - 您可以在此处存储有关产品的所有信息,但不同尺寸,颜色等细节除外。
  2. 属性 - 您将链接到产品,并为您指定值的每个属性
  3. 产品

    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. products表格中创建相关的产品ID列;这会限制每个产品只有一个相关产品。
    2. 创建一个相关的产品表,您可以在其中存储两个产品之间的组合。
    3. related_products

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

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

      希望这有帮助。