max(field2)中的max(field1)必须使用内部联接吗?

时间:2018-10-05 17:38:24

标签: sql hibernate mysqli

我希望在另一个字段(时间戳)的最大值内找到一个字段的最大值(tradeId,但强制转换为Long)。

我有以下HQL查询,该查询工作正常且快速,但我想知道将表本身连接起来是否真的是实现此目的的最优雅方法? EXPLAIN告诉我“选择已优化的表”,也许不是吗?

@Query("select max(cast(t1.tradeId as long)) from TradeDbo t1 inner join TradeDbo t2 on t1.id = t2.id"
       +" where t2.timestamp = (select max(timestamp) from TradeDbo where currencyPair.id = :currencyPairId)")

TradeDbo类:

public class TradeDbo extends Auditable<String> {
  @Id @GeneratedValue   
  @Getter private Long id;

  @JoinColumn(name = "currency_pair_id")
  @ManyToOne(fetch=FetchType.EAGER) 
  @Getter private CurrencyPairDbo currencyPair;

  @Column(name = "timestamp")
  @Convert(converter = DateConverter.class)
  @Getter private Date timestamp;

  @Column(name = "trade_id")
  @Getter private String tradeId;
  ...

HQL生成的SQL是:

select max(cast(tradedbo0_.trade_id as signed)) as col_0_0_ from trade tradedbo0_ 
inner join trade tradedbo1_ on (tradedbo0_.id=tradedbo1_.id) 
where tradedbo1_.timestamp=(select max(tradedbo2_.timestamp) 
from trade tradedbo2_ where tradedbo2_.currency_pair_id=21185903) 

1 个答案:

答案 0 :(得分:0)

您可以避免在同一张表上重复加入

select max(cast(trade_id as signed)) as col_0_0_ 
from trade 
INNER JOIN (
    select max(timestamp)  max_value
    from tradewhere currency_pair_id=21185903
) t on t.max_value = trade.timestamp
相关问题