【问题标题】:Group by doesn't give me the newest groupGroup by 没有给我最新的组
【发布时间】:2011-10-14 19:59:37
【问题描述】:

我试图从我的表中获得不同的结果,人们说我应该使用 group by。这工作了一半......我现在得到了不同的结果,但结果不是最新的线程......我的表格包含几座建筑物的公寓的状态。公寓可以多次找到,因为它是一个历史表...我需要进行选择以检索具有当前状态的不同公寓。

ID    Building Apartment_id  Status
1     1        1             1
2     1        1             2
3     2        2             3
4     2        4             2
5     2        3             2
6     2        5             1
7     2        6             1

我目前正在与:

SELECT * FROM `ib30_history` GROUP BY apartment_id, building ORDER BY id DESC

【问题讨论】:

标签: mysql group-by distinct


【解决方案1】:
SELECT 
  Building
  , Appartment_id
  , Status 
FROM ib30_history a
WHERE id = ( SELECT MAX(id) FROM ib30_history b 
             WHERE b.Building = a.Building AND b.Appartment_id = a.Appartment_id)

【讨论】:

  • 这个看起来很有希望......它很慢,但它似乎给了我正确的结果 - 经过更多测试后我会回复你
  • 是的,执行引擎可能难以正确简化子查询。我更喜欢子查询,因为大多数时候它们对于代码阅读器来说更容易理解(代码的阅读频率高于编写频率)。但是,有时差异很大,并且必须执行子查询,但是您可以检查运行时,也许可以根据我的建议进行 EXPLAIN SELECT。
  • 谢谢你的回答..它检查了..你的 sql 给了我我正在寻找的结果! :) 当我获得更多历史记录行时,对这将如何扩展有什么想法吗?
  • 不太好。我建议从结构上解决这个问题。在我添加到历史表之后,我可能会使用触发机制或单独的写入来创建一个浓缩表。这样做的好处是可以在定义的时间内确定状态,而不是根据历史记录表中的记录数来衡量运行时间。
  • 非常感谢...我会考虑再做一张桌子:)
【解决方案2】:
 select h.apartment_id, h.status
  from history h 
       join (select apartment_id, max(status) status
               from history
              group by apartment_id) recent 
       on h.apartment_id = recent.apartment_id 
      and h.status = recent.status

【讨论】:

  • 恐怕这无济于事......它返回不止一行公关。公寓...我需要该列表仅包含 1 行公关。公寓喜欢独特的
  • 我只是建议对此查询进行编辑以更正其结果。就个人而言,我发现这个派生表使用子查询比相关子查询更具可读性,因为“这个子查询的结果是什么”和“这个子查询与查询的其余部分有什么关系”是分开的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-11-24
  • 2021-04-01
  • 2011-03-28
  • 2011-09-01
  • 2012-01-14
  • 2023-01-02
  • 2018-12-11
相关资源
最近更新 更多