0

我正在研究在 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
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 BYand 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。不知道为什么你需要加入 Demand 或 Offer,除非这些链接到你的 Deal 表。发布您的表结构将减轻这种担忧......

- 编辑 -

关于您的评论,您只想显示有报价或有需求的资产?如果是这样,这应该工作:

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 回答