2012-01-21 2 views
0

지금은 4 개 테이블이 : 다음 질의 :EAV의 쿼리 및 테이블

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' 열을 없애고 해당 열이없는 속성과 값을 얻을 수 있다면? 난 그냥 원하는 동안

table attributes 
-id 1 
-attribute Weight 
-product_id 1 

-id 2 
-attribute Weight 
-product_id 2 

: 지금은 예를 들어 복제 속성의 전체 무리의 내 영어에 대한

-id 1 
-attribute Weight 

미안 내 게시물의 일부 더 많은 설명을 필요로하는 경우, 지금

을 나에게주세요
+0

'product' 테이블의 설명에서'category_id'가 없습니다. –

+0

EAV의 한계점을 떠나서, 당신의 디자인은 다른 제품들이 다른 속성 (테이블'속성'에 저장되어있는 속성)을 가질 수 있다고 제안합니다. 이러한 기능을 원하지 않는다면 @ vucetica의 접근 방식을 사용할 수 있습니다. –

답변

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에 넣는 방식은 좋지 않습니다.

+0

하지만 intence 10 속성이 있다면? – nazarov

+0

10 행을 반환합니다. 너는 그걸 원하지 않니? –

+0

그러면 OP가 제품 당 하나의 카테고리로 제한됩니다. 그것이 비판이 아니라 관찰입니다. –