我正在研究在 MySQL 中实现的 EAV 数据库,所以当我说实体时,您可以将其读取为表。由于它是一个非关系数据库,我无法为表等提供任何 SQL,但我希望得到关系数据库的概念答案,我将自己转换为 EAV SQL。
我正在建立一个迷你股票市场系统。有一个“资产”实体可以有许多“需求”和“要约”实体。资产实体也可能有许多“交易”实体。每个交易实体都有一个“share_price”属性。并非所有资产都有需求、报价或交易实体。
我想返回按资产分组的报价和需求实体列表,即如果资产有 2 个报价和 3 个需求,则只会显示 1 个结果。这必须按与需求或要约资产相关的交易的最高股价进行排序。然后,对每个需求或报价的最高 share_price 进行整体排序。如果资产有需求或要约但没有交易,则 share_price 将返回 NULL。
所以说数据是这样的:
Asset 1 has 1 offer, 1 demand and 2 deals with share_price 7.50 and 12.00
Asset 2 has 1 offer and 1 deal with share_price 8.00
Asset 3 has 3 offers and 3 demands and no deals
Asset 4 has no offers and no demand and 1 deal with share_price 13.00
我想要结果:
Asset share_price
Asset 1 12.00
Asset 2 8.00
Asset 3 null
注意:资产 4 不在结果集中,因为它没有报价或需求。
我知道这是一个复杂的问题,我真的不想多次访问数据库或在 PHP 中进行任何数组重新排序。非常感谢任何帮助。
有些用户希望看到我拥有的 SQL。在这里,但这并没有太大意义,因为它是一个专门的 EAV 数据库。
SELECT DISTINCT data.asset_guid, r.guid_two, data.share_price FROM (
select rr.guid_one as asset_guid, max(msv.string) as share_price from market_entities ee
join market_entity_relationships rr on ee.guid = rr.guid_two
JOIN market_metadata as mt on ee.guid = mt.entity_guid
JOIN market_metastrings as msn on mt.name_id = msn.id
JOIN market_metastrings as msv on mt.value_id = msv.id
where subtype = 6 and msn.string = 'share_price' and rr.relationship = 'asset_deal'
group by
rr.guid_one
) data
left outer JOIN market_entities e on e.guid = data.asset_guid
left outer JOIN market_entity_relationships r on r.guid_one = e.guid
WHERE r.relationship = 'trade_share'
GROUP BY data.asset_guid