首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >EAV查询和表

EAV查询和表
EN

Stack Overflow用户
提问于 2012-01-21 23:36:46
回答 1查看 900关注 0票数 0

现在我有4个表:

代码语言:javascript
复制
table categories:
-id
-category

table products:
-id
-product
-price
-image

table attributes:
-id
-attribute
-product_id

table values:
-product_id
-attribute_id
-value

我的查询条件是:

代码语言:javascript
复制
SELECT `id`, `product`, `price`, `image` FROM `products` WHERE `category_id` = $category->id

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

代码语言:javascript
复制
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)

它是获取带有值的属性,但我想知道一件事:是否有可能在table attributes中去掉'product_id'列,而不使用该列来获取属性和值?现在它是一大堆重复的属性,例如:

代码语言:javascript
复制
table attributes 
-id 1
-attribute Weight
-product_id 1

-id 2
-attribute Weight
-product_id 2

而我只想:

代码语言:javascript
复制
-id 1
-attribute Weight

很抱歉我的英文,如果我的帖子中的某些部分需要更多的解释,请现在就让我来

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-01-22 00:54:50

这取决于您是否希望您的属性是特定于产品的,但很明显,您不需要。此外,如果您的属性表中有product_id,则不需要在值表中使用它。因此,如果您的表是这样的,那么它们就更有意义:

代码语言:javascript
复制
table categories:
-id
-category

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

table attributes:
-id
-attribute
-product_id

table values:
-attribute_id
-value

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

代码语言:javascript
复制
table categories:
-id
-category

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

table attributes:
-id
-product_id
-attribute
-value

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

代码语言:javascript
复制
SELECT id, product, price, image, attribute, value
FROM products
    INNER JOIN attributes ON products.id = attributes.product_id
WHERE products.category_id = :category_id

确保您有适当的索引。此外,选择产品is然后将其放入IN的方式也是一种糟糕的做法。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8954222

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档