用于基于EAV的库存控制应用程序的MySQL自连接

用于基于EAV的库存控制应用程序的MySQL自连接,mysql,entity-attribute-value,self-join,Mysql,Entity Attribute Value,Self Join,这个问题与我在报告中提出的有关库存控制应用程序的问题有关 我正在尝试创建一个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'

这个问题与我在报告中提出的有关库存控制应用程序的问题有关

我正在尝试创建一个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
这看起来很混乱,但我可怜的大脑无法想出更好的办法


有什么建议吗?

如果您先存储属性列表,您也可以使用
值作为属性,而不是使用
属性id作为att1
。您可以简单地缓存查询,然后在一个清除查询中选择所有需要的数据

假设您已首先获取属性id列表(即从eav_值中选择属性id
),请选择以下选项:

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)
...

如果先存储属性列表,则也可以使用
值作为属性,而不是将
属性\u id用作att1
。您可以简单地缓存查询,然后在一个清除查询中选择所有需要的数据

假设您已首先获取属性id列表(即从eav_值中选择属性id
),请选择以下选项:

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)
...

这方面的问题是,每一行的属性(att1和att2)可能出现相反的方向,这取决于它们在“eav_值”表中的位置,即一行的att1可能是下一行的att2。我不确定如何防止这种情况发生。我已经为我的意思添加了一个例子。您将使用实际的
属性\u id
,而不是使用
att1
。或者甚至属性的名称。感谢WoLpH的回复。您的代码应该读为“选择v1.value\u id作为$attribute\u 1”,还是有更好的方法获取属性?使用Zend Framework(php)。@Ben Muncey:是的,这正是我的意思。我不确定您是否在谈论
PHP
,因此我没有添加示例代码。我只需要创建一个这样的查询并将其添加到缓存系统中。如果某些值在某些情况下可以是空的,而不是可以考虑使用<代码>左联接< /代码>,而是使它们成为可空的。问题是,每一行的属性(ATT1和ATT2)可能出现相反的方式,依赖于它们在“EavyValm”表中的位置,即一行的ATT1可以是下一行的ATT2。我不确定如何防止这种情况发生。我已经为我的意思添加了一个例子。您将使用实际的
属性\u id
,而不是使用
att1
。或者甚至属性的名称。感谢WoLpH的回复。您的代码应该读为“选择v1.value\u id作为$attribute\u 1”,还是有更好的方法获取属性?使用Zend Framework(php)。@Ben Muncey:是的,这正是我的意思。我不确定您是否在谈论
PHP
,因此我没有添加示例代码。我只需要创建一个这样的查询并将其添加到缓存系统中。如果某些值在某些情况下可能是空的,而不是可以考虑使用<代码>左联接< /代码>,而是使它们无效。