我正在开发一个用MySQL实现的EAV数据库,所以当我说实体时,你可以将其读作表格。因为它是一个非关系型数据库,所以我不能为表等提供任何SQL,但我希望得到一个关系型数据库的概念性答案,我会自己翻译成EAV SQL。
我正在构建一个迷你股票市场系统。有一个“资产”实体,它可以有许多“需求”和“提供”实体。资产实体也可以有许多“交易”实体。每个交易实体都有一个"share_price“属性。并非所有资产都有需求、要约或交易实体。
我想返回一个报价和需求实体列表,按资产分组,即如果资产有2个报价和3个需求,则只会显示一个结果。这必须按附加到需求或报价资产的交易的最高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发布于 2013-03-07 06:51:24
在没有完全理解您的表结构的情况下(您应该发布一下),看起来您只需要使用一个带有GROUP BY和MAX的LEFT JOIN
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-07 06:42:14
假设您有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 assethttps://stackoverflow.com/questions/15259551
复制相似问题