0

私は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
4

2 に答える 2

0

アセット、オファー、シェアの 3 つのテーブルがあると仮定すると、次のようなクエリを使用できます。

SELECT asset, MAX(share_Price)
FROM assets
 INNER JOIN offers ON assets.id = offers.id //requires there are offers
 LEFT OUTER JOIN shares ON assets.id = shares.id // returns results even if no shares
GROUP BY asset
ORDER BY asset
于 2013-03-06T22:42:14.270 に答える
0

LEFT JOINテーブル構造を完全に理解していない場合 (投稿する必要があります)、単一の , とGROUP BYを使用する必要があるように見えますMAX:

SELECT a.assetname, MAX(d.share_price)
FROM asset a
   LEFT JOIN deal d ON a.AssetId = d.AssetId
GROUP BY a.assetname
ORDER BY MAX(d.share_price) DESC

Asset テーブルと Deal テーブルに共通のキー (上記の場合は AssetId) があると仮定しています。ディール テーブルにリンクされていない限り、オンデマンドまたはオファーに参加する必要がある理由がわかりません。テーブル構造を投稿すると、その懸念が軽減されます...

- 編集 -

あなたのコメントに関しては、オファーまたは需要のあるアセットのみを表示したいですか? もしそうなら、これはうまくいくはずです:

SELECT a.assetname, MAX(d.share_price)
FROM asset a
   LEFT JOIN deal d ON a.AssetId = d.AssetId
   LEFT JOIN offer o ON o.AssetId = d.AssetId
   LEFT JOIN demand de ON de.AssetId = d.AssetId
WHERE o.AssetId IS NOT NULL OR de.AssetId IS NOT NULL
GROUP BY a.assetname
ORDER BY MAX(d.share_price) DESC

これには、少なくともオファーまたは少なくとも需要がある場合にのみ、アセットが含まれます。

于 2013-03-06T22:51:24.037 に答える