0

现在我有 4 张桌子:

table categories:
-id
-category

table products:
-id
-product
-price
-image

table attributes:
-id
-attribute
-product_id

table values:
-product_id
-attribute_id
-value

我正在查询:

SELECT `id`, `product`, `price`, `image` FROM `products` WHERE `category_id` = $category->id

现在我得到了这个类别的产品数组,需要得到它的属性:下一个查询:

SELECT `products`.`id` AS `product_id`, 
`attributes`.`attribute`, 
`values`.`value` 
FROM `products` LEFT JOIN `attributes` ON (`attributes`.`product_id` = `products`.`id`) 
LEFT JOIN `values` ON (`values`.`product_id` = `products`.`id` 
AND `values`.`attribute_id` = `attributes`.`id`) 
WHERE `products`.`id` IN ($ids)

它通过值获取属性,但我想知道一件事:是否有可能摆脱'product_id'table attributes并在没有该列的情况下获取属性和值?现在它是一大堆重复的属性,例如:

table attributes 
-id 1
-attribute Weight
-product_id 1

-id 2
-attribute Weight
-product_id 2

虽然我只想:

-id 1
-attribute Weight

对不起我的英语,如果我的帖子的某些部分需要更多解释,请让我现在

4

1 回答 1

0

这取决于您是否希望您的属性是特定于产品的,但您显然不希望。此外,如果您的属性表中有 product_id,则您的值表中不需要它。因此,如果您的表格如下所示,则它们更有意义:

table categories:
-id
-category

table products:
-id
-product
-price
-image
-category_id

table attributes:
-id
-attribute
-product_id

table values:
-attribute_id
-value

实际上,我会让它变得更简单 EAV:

table categories:
-id
-category

table products:
-id
-product
-price
-image
-category_id

table attributes:
-id
-product_id
-attribute
-value

然后,您的查询将如下所示:

SELECT id, product, price, image, attribute, value
FROM products
    INNER JOIN attributes ON products.id = attributes.product_id
WHERE products.category_id = :category_id

确保您有适当的索引。此外,您希望通过选择产品 ID 然后将它们放入 IN 来执行此操作的方式是一种不好的做法。

于 2012-01-21T16:54:50.243 回答