Самостоятельное присоединение MySQL к приложению управления запасами на основе EAV

Этот вопрос относится к схеме, которую я предложил в моем первоначальный вопрос относительно управления запасами применение.

Я пытаюсь создать запрос 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"
    }
}

Это кажется очень запутанным, но мой бедный мозг неспособен придумать что-то лучшее.

Какие-либо предложения?


person Ben Muncey    schedule 09.08.2010    source источник


Ответы (1)


Вместо использования attribute_id AS att1 вы также можете использовать value AS attribute_X, если сначала сохраните список атрибутов. Вы можете просто кэшировать запрос, после чего вы можете просто выбрать все необходимые данные в 1 чистый запрос.

Предполагая, что вы сначала получили список идентификаторов атрибутов (например, SELECT attribute_id FROM eav_value), выберите это:

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)
...
person Wolph    schedule 10.08.2010
comment
Проблема заключается в том, что атрибуты для каждой строки (att1 и att2) могут отображаться противоположным образом, в зависимости от их позиций в таблице 'eav_value', т.е. att1 для одной строки может быть att2 для следующей. Я не знаю, как этого можно избежать. - person Ben Muncey; 10.08.2010
comment
Я добавил пример того, что имел в виду. Вместо использования att1 вы будете использовать фактический attribute_id. Или даже название атрибута. - person Wolph; 10.08.2010
comment
Спасибо за ответы WoLpH. Должен ли ваш код читать «SELECT v1.value_id AS $ attribute_1» или есть лучший способ получить атрибут? Использование Zend Framework (php). - person Ben Muncey; 10.08.2010
comment
@ Бен Манси: Да, именно это я и имел в виду. Я не был уверен, говорите ли вы о PHP или нет, поэтому я не стал добавлять пример кода. Я бы просто создал такой запрос и добавил его в вашу систему кеширования. Если некоторые значения могут быть пустыми в некоторых случаях, вы можете рассмотреть возможность использования LEFT JOIN вместо этого, чтобы сделать их допускающими значение NULL. - person Wolph; 10.08.2010