首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >多个order by SQL

多个order by SQL
EN

Stack Overflow用户
提问于 2013-03-07 06:39:55
回答 2查看 198关注 0票数 0

我正在开发一个用MySQL实现的EAV数据库,所以当我说实体时,你可以将其读作表格。因为它是一个非关系型数据库,所以我不能为表等提供任何SQL,但我希望得到一个关系型数据库的概念性答案,我会自己翻译成EAV SQL。

我正在构建一个迷你股票市场系统。有一个“资产”实体,它可以有许多“需求”和“提供”实体。资产实体也可以有许多“交易”实体。每个交易实体都有一个"share_price“属性。并非所有资产都有需求、要约或交易实体。

我想返回一个报价和需求实体列表,按资产分组,即如果资产有2个报价和3个需求,则只会显示一个结果。这必须按附加到需求或报价资产的交易的最高share_price排序。然后,对每个需求或优惠的最高share_price进行整体排序。如果资产有需求或优惠,但没有交易,则对于share_price,将返回NULL。

假设数据是这样的:

代码语言:javascript
复制
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

我想要结果:

代码语言:javascript
复制
Asset       share_price
Asset 1     12.00
Asset 2     8.00
Asset 3     null

注:资产4不在结果集中,因为它没有要约或需求。

我知道这是一个复杂的问题,我真的不想在PHP中多次访问数据库或进行任何数组重新排序。非常感谢您的帮助。

有些用户想看看我的SQL。它在这里,但这不会有太多的意义,因为它是一个专门的EAV数据库。

代码语言:javascript
复制
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
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-03-07 06:51:24

在没有完全理解您的表结构的情况下(您应该发布一下),看起来您只需要使用一个带有GROUP BYMAXLEFT JOIN

代码语言:javascript
复制
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。不确定为什么你需要加入按需或优惠,除非它们链接到你的交易表。张贴你的表结构可以减轻这种担忧……

编辑----

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

代码语言:javascript
复制
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

这将只包括资产,如果它至少有一个要约或至少一个需求。

票数 0
EN

Stack Overflow用户

发布于 2013-03-07 06:42:14

假设您有3个表、资产、报价和股票,您可以使用如下查询。

代码语言:javascript
复制
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
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15259551

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档