3

我想做一个子查询,然后内部连接结果以产生查询。我想这样做,因为我已经测试了一个内部连接查询,与直接 IN 子查询相比,它在 MySql 上的性能似乎要高得多。

下面是我试图重现的 sql 类型的一个非常基本的示例。

物品

  • 项目 ID
  • 姓名

项目关系

  • 项目 ID
  • 关系 ID

我想创建的示例 Sql

给我名称为“bob”的项目的关系计数:

select ir.itemId, count(ir.relationId)
  from ItemRelations ir
    inner join (select itemId from Items where name = 'bob') sq
    on ir.itemId = sq.itemId
  group by ir.itemId

基本的 Nhibernate QueryOver

var bobItems = QueryOver.Of<Item>(() => itemAlias)
  .Where(() => itemAlias.Name == "bob")
  .Select(Projections.Id());

var bobRelationCount = session.QueryOver<ItemRelation>(() => itemRelationAlias)
   .Inner.Join(/* Somehow join the detached criteria here on the itemId */)
   .SelectList(
      list =>
        list.SelectGroup(() => itemRelationAlias.ItemId)
          .WithAlias(() => itemRelationCountAlias.ItemId)
        .SelectCount(() => itemRelationAlias.ItemRelationId)
          .WithAlias(() => itemRelationCountAlias.Count))
   .TransformUsing(Transformers.AliasToBean<ItemRelationCount>())
   .List<ItemRelationCount>();

我知道可以将其重构为单个查询,但是以上只是作为简单示例。我无法更改分离的 QueryOver,因为它已交给我的代码并用于系统的其他部分。

有谁知道是否可以根据分离的标准进行内部连接?

4

1 回答 1

0

MySql 5.6.5 解决了与查询结构相关的性能问题。

见这里:http ://bugs.mysql.com/bug.php?id=42259

我不再需要更改我的 NHibernate 查询的输出格式。:)

于 2013-03-26T16:43:28.733 回答