我正在研究在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
答案 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 BY
和MAX
{/ 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
如果资产至少有要约或至少有需求,则只包括该资产。