2010-08-09 4 views
2

이 질문은 original question에서 재고 관리 응용 프로그램과 관련하여 제안한 schema과 관련이 있습니다.EAV 기반 재고 관리 응용 프로그램에 대한 MySQL 자체 조인

특정 항목에 대한 현재 재고를 제공하는 MySQL 쿼리를 만들려고합니다.

쿼리가 작동하지만 필요한 정보를 얻는보다 효율적인 방법이 있는지 궁금해했습니다.

SELECT 's'.*, 
    'v1'.'attribute_id' AS 'att1', 
    'v1'.'value' AS 'val1' 
    'v2'.'attribute_id' AS 'att2', 
    'v2'.'value' AS 'val2' 
FROM 'eav_ev' AS 'ev1' 
INNER JOIN 'stock' AS 's' ON s.id = ev1.stock_id 
INNER JOIN 'eav_ev' AS 'ev2' ON ev1.stock_id = ev2.stock_id 
INNER JOIN 'eav_value' AS 'v1' ON v1.id = ev1.value_id 
INNER JOIN 'eav_value' AS 'v2' ON v2.id = ev2.value_id 
WHERE (ev1.entity_id = '45') 
    AND (ev1.value_id <> ev2.value_id) 
    AND (s.total > 0) 
GROUP BY 'ev1'.'stock_id' 
ORDER BY 'ev1'.'value_id' ASC 

array (1) { 
    [0] => array(5) { 
     ["stock_id"] => "2" 
     ["att1"] => "3" 
     ["val1"] => "M12" 
     ["att2"] => "4" 
     ["val2"] => "45" 
    } 
} 

그것은 매우 더러워 보이지만 불쌍한 내 뇌가 더 좋은 것을 함께 올라오고 불가능하다의 라인을 따라 뭔가를 반환합니다.

제안 사항?

답변

0

을 사용하는 대신 속성 목록을 먼저 저장하는 경우 value AS attribute_X을 사용할 수도 있습니다. 간단하게 쿼리를 캐싱하면 1 개의 명확한 쿼리에서 필요한 모든 데이터를 선택할 수 있습니다. 나는 다음과 같은 질문/기사 건너 온 일부 검색 후

SELECT 
    v1.value_id AS attribute_1 -- (or whatever the ID was fetched in the first query) 
    v2.value_id AS attribute_2 -- (or whatever the second ID was fetched in the first query) 
... 
+0

이 문제는 각 행 (att1 및 att2)의 속성이 'eav_value'테이블의 위치에 따라 반대 방향으로 나타날 수 있습니다. 즉, 한 행의 att1이 다음 행의 att2 일 수 있습니다. 어떻게 예방할 수 있을지 모르겠습니다. –

+0

나는 내가 의미했던 것에 대한 예를 추가했다. 'att1'을 사용하는 대신 실제'attribute_id'를 사용할 것입니다. 또는 속성의 이름조차도. – Wolph

+0

답장 WoLpH에 감사드립니다. 코드에서 'SELECT v1.value_id AS $ attribute_1'을 읽거나 속성을 얻는 더 좋은 방법이 있습니까? 젠드 프레임 워크 (php) 사용하기. –

0

:

당신은 ID를 첫 번째 (즉 SELECT attribute_id FROM eav_value),이 옵션을 선택 속성의 목록을 가져했습니다 가정하면.

Zend Select with self join overwriting fields

나는이 내 자신의 질문에 대답 할 수있는 방법을가는 것 같아요. 속성을 올바르게 할당하려면 쿼리를 '후 처리'해야하는 것처럼 보입니다. 상당히 쉽지만 지저분 해 보입니다.

관련 문제