SQL的多个订单

时间:2013-03-06 22:39:55

标签: mysql sql

我正在研究在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

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

如果没有完全理解您的表格结构(您应该发布),看起来您只需要使用LEFT JOIN GROUP BYMAX {/ p>}。{/ p>

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

如果资产至少有要约或至少有需求,则只包括该资产。