基于 EAV 的库存控制应用程序的 MySQL 自连接
-
27-09-2019 - |
题
这个问题涉及到 图式 我在我的建议中 原问题 关于库存控制申请。
我正在尝试创建一个 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 个清晰的查询中选择所有需要的数据。
假设您首先获取了属性 ID 列表(即 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)
...
其他提示
经过一番搜索后,我发现了以下问题/文章。
我想这在某种程度上回答了我自己的问题。看起来好像有必要“后处理”查询才能正确分配属性。相当容易做,但看起来很混乱。
不隶属于 StackOverflow