MySQL Self-join для приложения акционерного управления на основе EAV

StackOverflow https://stackoverflow.com/questions/3444985

Вопрос

Этот вопрос относится к схема Я предложил в моем Оригинальный вопрос Что касается приложения акционерного контроля.

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

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

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

Это было полезно?

Решение

Вместо того, чтобы использовать 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)
...

Другие советы

После некоторых поисков я наткнулся на следующий вопрос / статью.

Zend Select с полями перезаписи

Я думаю, это идет как-то, чтобы ответить на мой вопрос. Похоже, что необходимо «постить процесс» запроса, чтобы правильно назначить атрибуты. Довольно легко сделать, но кажется грязным.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top