【问题标题】:Avoiding a nested subquery containing a group by避免包含 group by 的嵌套子查询
【发布时间】:2012-09-12 21:26:55
【问题描述】:

有没有更好的方法来执行这个查询而不使用嵌套子查询?

-- select all races for jockeys which have multiple regions
select distinct r.id, r.description
from jockeys_races jra inner join races r on r.id = jra.race_id
where jra.jockey_id in (
    select jre.jockey_id
    from jockeys_regions jre
    group by jre.jockey_id
    having count(*) > 1
);

骑师可以属于多个地区。骑师可以参加多个比赛。

【问题讨论】:

  • 不是我所知道的,尽管我可能会使用“where Exists”语句而不是“where feild IN()”。这只是个人喜好。
  • @FrankThomas 。 . .在 MySQL 中,使用 EXISTS 不仅仅是个人喜好。使用 EXISTS 而不是使用子查询的 IN 可以更好地优化查询。

标签: mysql sql group-by subquery


【解决方案1】:

它可能效率不高(因为产品会更大),但你可以做到。检查两者的解释。

select distinct r.id, r.description
from races r
  inner join jockey_races jra on r.id = jra.race_id
  inner join jockey_regions jre on jra.jockey_id = jre.jockey_id
group by r.id, r.description, jre.jockey_id
having count(*) > 1

【讨论】:

  • 这个查询的问题是从 races 到 jockey_races 的连接可能会产生重复。这些将被计算在内,因此这不会返回与原始查询相同的结果。
  • 使用我创建的测试数据,它们都产生了相同的结果。 HAVING 和 DISTINCT 做了巫术。 (测试数据有多个种族,每场比赛的骑师组不同,每个骑师的地区数量不同,这似乎与原始规格相符)。
  • 接受这个答案,因为我认为它不会产生重复,但我会进一步评估它。谢谢!
【解决方案2】:

我相信你可以做到:

select distinct r.id, r.description
from jockeys_races jra 
inner join races r on r.id = jra.race_id
inner join jockeys_regions jre on jre.jockey_id=jra.jockey_id
group by r.id, r.description, jre.jockey_id
having count(jre.region) > 1

【讨论】:

    【解决方案3】:

    您不想在 MySQL 中将 IN 与子查询一起使用。 . .优化器在这个结构上做得很差。在这种情况下,您可以将子查询移至 FROM 子句:

    select distinct r.id, r.description
    from jockeys_races jra inner join
         races r
         on r.id = jra.race_id join
         (select jre.jockey_id
          from jockeys_regions jre
          group by jre.jockey_id
          having count(*) > 1
         ) ji
         on jra.jockey_id = ji.jockey_id
    

    【讨论】:

    • 没有回答原始问题,但无论如何都是好的建议。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-08
    • 1970-01-01
    • 1970-01-01
    • 2011-02-16
    • 1970-01-01
    • 2021-02-26
    相关资源
    最近更新 更多