私はMySQLに実装されたEAVデータベースに取り組んでいるので、エンティティと言うと、それをテーブルとして読むことができます。これは非リレーショナル データベースであるため、テーブルなどに SQL を提供することはできませんが、リレーショナル データベースの概念的な答えを得たいと考えており、自分で EAV SQL に変換します。
ミニ株式市場システムを構築しています。多くの「需要」および「提供」エンティティを持つことができる「資産」エンティティがあります。資産エンティティには、多くの「取引」エンティティも含まれる場合があります。各取引エンティティには「share_price」属性があります。すべてのアセットにデマンド、オファー、または取引エンティティがあるわけではありません。
アセットごとにグループ化されたオファーおよびデマンド エンティティのリストを返したいと思います。つまり、アセットに 2 つのオファーと 3 つのデマンドがある場合、1 つの結果のみが表示されます。これは、デマンドまたはオファーのアセットに関連付けられた取引の中で最も高い share_price でソートする必要があります。次に、各デマンドまたはオファーの最高の 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